Сравните истинный / ложный массив с другим массивом - PullRequest
5 голосов
/ 19 июня 2019

Какой самый быстрый способ сравнить два массива и вернуть третий массив, содержащий значения из array2, где связанные значения из array1 равны true?

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

Результат должен быть:

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

Ответы [ 3 ]

7 голосов
/ 19 июня 2019

Используйте 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 голос
/ 19 июня 2019

Filter функция медленнее, чем для цикла. Более быстрый вариант - использовать для цикла с или без троичного оператора . Это быстрее, чем функция 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);
0 голосов
/ 19 июня 2019

Вы можете использовать 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');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...