Javascript 如何在下划线中使用u.where()来比较值,而不考虑大小写

Javascript 如何在下划线中使用u.where()来比较值,而不考虑大小写,javascript,arrays,html,underscore.js,lowercase,Javascript,Arrays,Html,Underscore.js,Lowercase,我有一个网页,如果在搜索框中键入了某个内容,它就会遍历该值的文件。我需要它,以便搜索/查找不区分大小写。区分大小写必须保留在文件中,但出于比较目的,它忽略了大小写 因此,目前我正在使用下划线命令: arr=_.where(arr,filter); 但是这两个数组arr和过滤器-我需要对它们进行比较/使用,而不考虑大小写,因此最终结果arr包含大小写混合的结果,但与arr中的值相匹配,请尝试改用: var过滤器=[“苹果”、“香蕉”、“橙色”]; var arr=[“苹果”、“橙色”]; //

我有一个网页,如果在搜索框中键入了某个内容,它就会遍历该值的文件。我需要它,以便搜索/查找不区分大小写。区分大小写必须保留在文件中,但出于比较目的,它忽略了大小写

因此,目前我正在使用下划线命令:

arr=_.where(arr,filter);
但是这两个数组
arr
过滤器
-我需要对它们进行比较/使用,而不考虑大小写,因此最终结果arr包含大小写混合的结果,但与
arr

中的值相匹配,请尝试改用:

var过滤器=[“苹果”、“香蕉”、“橙色”];
var arr=[“苹果”、“橙色”];
//将过滤器放在下格一次
var filterLower=u2;.invoke(filter,“toLowerCase”);
var arr2=u2;.filter(arr,函数(v){
//将条目设置为小写,并查看它是否位于过滤器下方
return.contains(filterLower,v.toLowerCase());
});
console.dir(arr2)

不幸的是,JS在国际化的不区分大小写的字符串比较方面并不出色。如果您只是坚持ASCII,那么解决方案相当简单(使用
过滤器
,而不是
where
):

或者,如果您希望在同一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()
由于后处理步骤而产生的最小次数和最小数据存储


为什么不在筛选函数中转换为相同的大小写?如果执行大量查询,则性能可能更高(在我的解决方案中,只有
n+q
toLowerCase
调用,而不是
n*q
,其中
n
是术语的数量,
q
是查询的数量),需要注意的是,此解决方案确实需要两倍的内存,如果术语列表很长,这可能会有问题。此外,Rhumboll稍作修改,但我认为OP一次只尝试搜索一个查询。我认为他们错误地调用了
filter
数组。此外,我认为这会更有效(恒定的查找时间)使用带有小写术语的
对象作为指向它们引用的原始字符串数组的键。然后,您还可以通过将单个已小写单词的值数组替换为更紧凑的类型(如
true
)来优化空间需求,只需知道如何解释即可。
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 : []);
}