Я не смог найти это в документации, есть ли встроенный простой способ для подмножества массива с использованием логического массива для фильтрации? В лодаш или эс6

Я часто использовал эту функцию в R, и она показалась мне весьма полезной. В последнее время я столкнулся с несколькими случаями использования, когда я мог использовать что-то подобное, но не мог выяснить, поддерживается ли оно из коробки.

Что-то типа

subset([1, 2, 3, 4, 5], [true, false, false, false, true]) // => [1, 5]
0
Leo 3 Фев 2020 в 22:00

3 ответа

const arr = [1, 2, 3, 4, 5];
const filter = [true, false, false, false, true];

const result = arr.filter((r, i) => filter[i]);
console.log(result);

Вы можете использовать встроенную функцию filter массива. Он имеет подпись, которая принимает индекс, также вы можете использовать его для фильтрации вашего массива, как показано ниже:

1
Eldar 3 Фев 2020 в 19:06

Как насчет следующего?

zip=rows=>rows[0].map((_,c)=>rows.map(row=>row[c]))
zip([[1, 2, 3, 4, 5], [true, false, false, false, true]]).filter(e => e[1])
// [ [ 1, true ], [ 5, true ] ]
0
Greg 3 Фев 2020 в 19:08

Быстрый способ сделать это будет что-то вроде

const f = (as, bs) => as.filter((_, i) => bs[i])
f([1, 2, 3, 4, 5], [true, false, false, false, true])  // => [1, 5]

Это предполагает, что два массива имеют одинаковую длину, которая может быть, а может и не быть тем, что вы хотите.

2
bugs 3 Фев 2020 в 19:05