【问题标题】:Compare true/false array with other array将真/假数组与其他数组进行比较
【发布时间】:2019-06-19 08:12:39
【问题描述】:

比较两个数组并返回包含来自array2 的值的第三个数组的最快方法是什么,其中来自array1 的关联值是true

const array1 = [true, false, false, true];
const array2 = ['a', 'b', 'c', 'd'];

结果应该是:

const result = ['a', 'd'];

【问题讨论】:

  • 您是在寻求最快的性能吗?

标签: javascript arrays ecmascript-6


【解决方案1】:

使用filter

const array1 = [true, false, false, true];
const array2 = ['a', 'b', 'c', 'd'];
const res = array2.filter((_, i) => array1[i]);
console.log(res);

ES5 语法:

var array1 = [true, false, false, true];
var array2 = ['a', 'b', 'c', 'd'];
var res = array2.filter(function(_, i) {
  return array1[i];
});
console.log(res);

【讨论】:

    【解决方案2】:

    Filter 函数比 for 循环慢。更快的选择是使用 for 循环 withwithout 三元运算符。它比filter 函数更快。

    我已经包含了一个代码 sn-p,它显示了每个选项需要多长时间。

    const array1 = [true, false, false, true];
    const array2 = ['a', 'b', 'c', 'd'];
    
    // filter
    console.time('filter');
    const result1 = array2.filter((_, i) => array1[i]);
    console.timeEnd('filter');
    console.log(result1);
    
    // for loop with ternary operator
    console.time('forLoopWithTernary');
    const result2 = [];
    for(let i = 0; i < array2.length; i++){
      (array1[i]) ? result2.push(array2[i]) : null;
    }
    console.timeEnd('forLoopWithTernary');
    console.log(result2);
    
    // for loop w/o ternary operator
    console.time('forLoopWithoutTernary');
    const result3 = [];
    for(let i = 0; i < array2.length; i++){
      if(array1[i])
        result3.push(array2[i]);
    }
    console.timeEnd('forLoopWithoutTernary');
    console.log(result3);

    【讨论】:

    • 我都得到了 0ms,我非常喜欢 .filter 的可读性...
    • @deceze 我也更喜欢filter 的可读性;但是,OP确实要求最快的方式。最后,filter 为 0.060ms,forLoopWithTernary 为 0.010ms,forLoopWithoutTernary 为 0.010ms。每次运行的时间都会改变。我承认差别不大,但它是 OP 要求的。
    【解决方案3】:

    你可以使用array.reduce:

    var array1 = [true, false, false, true];
    var array2 = ['a', 'b', 'c', 'd'];
    
    console.time('reduce');
    var res = array1.reduce((total, currentValue, index) => {
        return currentValue ? [...total, array2[index]] : total;
      },  []);
    console.log(res);
    console.timeEnd('reduce');

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-17
      • 2016-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多