如何通过下划线的地图和过滤器实现最高效率?

Ric*_*ard 16 javascript underscore.js

是否可以组合Underscore的过滤器和地图?我目前有两个独立的函数调用,但我想知道我是否可以通过将它们组合成一个单独的调用来提高它们的效率.

基本上我有一系列国家/地区名称 - 我想使用正则表达式过滤它们,然后将过滤后的结果映射到DataItem对象数组.这是我目前的代码:

var filteredData = _.filter(allCountries, function(n, i){ 
  var re = RegExp("^" + searchString, "i");
  if (re.exec(n['country'].toLowerCase()) !== null) {
    return true;
  }
});
var mappedData = _.map(filteredData, function(n, i){ 
  return new DataItem(i, n['name'], n['budget']);
});
Run Code Online (Sandbox Code Playgroud)

还将非常感激地提出任何其他提高效率的建议.

pim*_*vdb 33

Underscore通过_.chain以下方式提供链接能力:

_.chain(allCountries)
 .filter(function(n, i) { ... })
 .map(function(n, i) { ... })
 .value(); // stop chaining and get the result
Run Code Online (Sandbox Code Playgroud)

而不是re.exec(...) !== null你可以使用re.test(...),并注意你需要转义特殊的正则表达式字符searchString.

但是,在这个简单的情况下,最好.indexOf用来检查字符串是否以子字符串开头:

// substring should be apparent at position 0, discard case for both strings
return n.country.toLowerCase().indexOf(searchString.toLowerCase()) === 0;
Run Code Online (Sandbox Code Playgroud)

对于字符串文字,.foo可能比更清楚['foo'].


geo*_*org 11

你可以each改用:

 result = []
_.each(array, function(elem) {
    if(elem.indexOf(search) == 0)
        result.push(...whatever...)
Run Code Online (Sandbox Code Playgroud)

另请注意,您不需要正则表达式来查明字符串是否以另一个字符串开头.

  • 链对每个都是优选的 (2认同)

Cas*_*ter 11

使用,_.reduce因为它节省了n迭代.将RegEx拉出循环,这样就不会在每次迭代时重新创建对象.使用test而不是exec(更快,因为它是一个简单的布尔结果).

var re = RegExp("^" + searchString, "i");
var data = _.reduce(allCountries, function(res, n, i) { 
  if (re.test(n['country'])) {
    res.push(new DataItem(i, n['name'], n['budget']));
  }
  return res;
}, []);
Run Code Online (Sandbox Code Playgroud)


PPP*_*aul 8

pimvdb的答案是我们在函数式编程/下划线中执行操作的方式.js同时执行这两个步骤有点过早优化.JS分别做这些事情并没有太大的好处.

_.chain(allCountries)
 .filter(function(n, i) { ... })
 .map(function(n, i) { ... })
 .value();
Run Code Online (Sandbox Code Playgroud)

以上内容很容易理解,但一旦我们开始合并责任,事情就会变得多毛.

_.mapFilter(数组,filterFn,mapFn)...

通过链接,我们牺牲了生产力的表现.两者都很重要,但总是一个比另一个更重要.我们不能回头提高生产力,但我们可以在事后提高绩效.