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

问题描述 投票:6回答:2

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

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

arr=_.where(arr,filter);

但是2个数组arrfilter-无论大小写,我都需要比较/使用它们,因此最终结果arr包含将混合大小写但与arr中的值匹配的结果。

javascript arrays html underscore.js lowercase
2个回答
1
投票

[不幸的是,在国际化不区分大小写的字符串比较方面,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()最少的次数和最少的数据存储。

Here's a JSFiddle for both


2
投票

尝试改用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);
© www.soinside.com 2019 - 2024. All rights reserved.