比较真/假数组与其他数组

时间:2019-06-19 08:12:39

标签: javascript arrays ecmascript-6

比较两个数组并返回包含array2的值(其中array1的相关值为true的第三个数组的最快方法是什么?

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

结果应为:

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

3 个答案:

答案 0 :(得分:7)

使用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);

答案 1 :(得分:1)

Filter函数比for循环慢。更快的选项是使用 with without 三元运算符进行循环。它比filter函数要快。

我提供了一个代码片段,该片段显示了每个选项花费的时间。

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);

答案 2 :(得分:0)

您可以使用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');