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

How to use _.where() in underscore to compare values regardless of case

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

所以目前我正在使用下划线命令:

arr=_.where(arr,filter);

但是 2 个数组 arrfilter - 我需要它们是 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()最少的次数和最少的数据存储。

Here's a JSFiddle for both