如何在下划线中使用_.where()来比较值,无论大小写如何

yig*_*mes 6 javascript arrays html5 lowercase underscore.js

我有一个网页,如果在搜索框中键入的内容然后迭代通过该值的文件,我需要它,以便搜索/查找不区分大小写.区分大小写必须保留在文件中,但为了进行比较,它忽略了大小写.所以目前我正在使用下划线命令:

arr=_.where(arr,filter);
Run Code Online (Sandbox Code Playgroud)

但是2个阵列arrfilter- 我需要比较/使用它们而不管情况如何,所以最终结果arr包含大小写混合但匹配值的结果arr.有人可以帮忙吗?

0x2*_*7r9 1

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

function getMatches(query, arr) {
  var lowerQuery = query.toLowerCase();
  return _.filter(arr, function(term) {
    return term.toLowerCase() == lowerQuery;
  });
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您希望预先计算所有内容,因为您希望在同一个 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 : []);
}
Run Code Online (Sandbox Code Playgroud)

toLowercase()由于后处理步骤,第二种方法的优点是仅计算最少的次数和最少的数据存储。

这是两者的 JSFiddle