最快的比较两个数组并返回第三个数组的方法是什么?新数组包含来自array2
的值,其中与array1
相关联的值为true
。
const array1 = [true, false, false, true];
const array2 = ['a', 'b', 'c', 'd'];
结果应该是:
const result = ['a', 'd'];
最快的比较两个数组并返回第三个数组的方法是什么?新数组包含来自array2
的值,其中与array1
相关联的值为true
。
const array1 = [true, false, false, true];
const array2 = ['a', 'b', 'c', 'd'];
const result = ['a', 'd'];
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);
Filter
函数比for循环慢。更快的选项是使用带有或不带三元运算符的for循环。它比filter
函数更快。
I've include a code snippet that shows how long each option takes.
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);
.filter
的可读性... - decezefilter
需要0.060ms,使用forLoopWithTernary
需要0.010ms,而使用forLoopWithoutTernary
也需要0.010ms。每次运行时间都会有所变化。我承认区别不大,但这正是OP要求的。 - codeherkarray.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');