比较两个数组并返回包含array2
的值(其中array1
的相关值为true
的第三个数组的最快方法是什么?
const array1 = [true, false, false, true];
const array2 = ['a', 'b', 'c', 'd'];
结果应为:
const result = ['a', 'd'];
答案 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');