如何在下划线中使用 _.where() 来比较值而不考虑大小写
How to use _.where() in underscore to compare values regardless of case
我有一个网页,如果在搜索框中输入内容,它会遍历文件以获取该值。我需要它 search/find 不区分大小写。区分大小写必须保留在文件中,但出于比较目的,它忽略了大小写。
所以目前我正在使用下划线命令:
arr=_.where(arr,filter);
但是 2 个数组 arr
和 filter
- 我需要它们是 compared/used 不管大小写所以最终结果 arr 包含大小写混合的结果但是匹配 arr
.
中的值
尝试使用 filter
代替:
var filter = ["Apple", "bANAna", "orange"];
var arr = ["apPle", "ORANGE"];
// make filter lower case once
var filterLower = _.invoke(filter, "toLowerCase");
var arr2 = _.filter(arr, function(v) {
// make entry lower case and see if it is in filterLower
return _.contains(filterLower, v.toLowerCase());
});
console.dir(arr2);
<script src="http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.4.4/underscore-min.js"></script>
不幸的是,在国际化的不区分大小写的字符串比较方面,JS 不是很好。如果你只是坚持使用 ASCII,那么解决方案非常简单(不过使用 filter
,而不是 where
):
function getMatches(query, arr) {
var lowerQuery = query.toLowerCase();
return _.filter(arr, function(term) {
return term.toLowerCase() == lowerQuery;
});
}
或者如果您想预先计算所有内容,因为您希望在同一个 JS 会话中进行大量查询:
var index = _.groupBy(arr, function(term) { return term.toLowerCase(); });
// Post-process index to reduce memory footprint by turning redundant values to nulls
// (which take up less memory than arrays with a string in them).
index = _.object(_.map(index, function(terms, key) {
return [key, (terms.length == 1 && terms[0].toLowerCase() == terms[0] ? null : terms)];
}));
function getMatches(query) {
var lowerQuery = query.toLowerCase();
return (lowerQuery in index ? index[lowerQuery] || lowerQuery : []);
}
由于post-处理步骤,第二种方法的优点是只计算toLowercase()
最少的次数和最少的数据存储。
我有一个网页,如果在搜索框中输入内容,它会遍历文件以获取该值。我需要它 search/find 不区分大小写。区分大小写必须保留在文件中,但出于比较目的,它忽略了大小写。
所以目前我正在使用下划线命令:
arr=_.where(arr,filter);
但是 2 个数组 arr
和 filter
- 我需要它们是 compared/used 不管大小写所以最终结果 arr 包含大小写混合的结果但是匹配 arr
.
尝试使用 filter
代替:
var filter = ["Apple", "bANAna", "orange"];
var arr = ["apPle", "ORANGE"];
// make filter lower case once
var filterLower = _.invoke(filter, "toLowerCase");
var arr2 = _.filter(arr, function(v) {
// make entry lower case and see if it is in filterLower
return _.contains(filterLower, v.toLowerCase());
});
console.dir(arr2);
<script src="http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.4.4/underscore-min.js"></script>
不幸的是,在国际化的不区分大小写的字符串比较方面,JS 不是很好。如果你只是坚持使用 ASCII,那么解决方案非常简单(不过使用 filter
,而不是 where
):
function getMatches(query, arr) {
var lowerQuery = query.toLowerCase();
return _.filter(arr, function(term) {
return term.toLowerCase() == lowerQuery;
});
}
或者如果您想预先计算所有内容,因为您希望在同一个 JS 会话中进行大量查询:
var index = _.groupBy(arr, function(term) { return term.toLowerCase(); });
// Post-process index to reduce memory footprint by turning redundant values to nulls
// (which take up less memory than arrays with a string in them).
index = _.object(_.map(index, function(terms, key) {
return [key, (terms.length == 1 && terms[0].toLowerCase() == terms[0] ? null : terms)];
}));
function getMatches(query) {
var lowerQuery = query.toLowerCase();
return (lowerQuery in index ? index[lowerQuery] || lowerQuery : []);
}
由于post-处理步骤,第二种方法的优点是只计算toLowercase()
最少的次数和最少的数据存储。