我有一个网页,如果在搜索框中输入了某些内容,则会在该文件中迭代该值。我需要它,以便搜索/查找不区分大小写。区分大小写必须保留在文件中,但出于比较目的,它忽略大小写。
所以目前我正在使用下划线命令:
arr=_.where(arr,filter);
但是2个数组arr
和filter
-无论大小写,我都需要比较/使用它们,因此最终结果arr包含将混合大小写但与arr
中的值匹配的结果。
[不幸的是,在国际化不区分大小写的字符串比较方面,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 : []);
}
由于后处理步骤,第二种方法的优点是仅计算toLowercase()
最少的次数和最少的数据存储。
尝试改用filter
:
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);