Как вернуть индексы из функции фильтра javascript (фильтруется по значениям)? - PullRequest
1 голос
/ 07 февраля 2020

Я хочу сделать что-то, что кажется простым, но я не могу понять это. Я хочу использовать функцию javascript «фильтр», чтобы найти значения в массиве, превышающем значение, а затем вернуть индексы, которые соответствуют этим отфильтрованным значениям (или значениям в этом диапазоне индексов из другого массива.

arr1 = [1,3,7,9,11];
arr1 = [2,4,8,10,12];
arr1.filter(x => x > 7);
// returns: [9,11]
// desired return: [4,5] (indices from arr1 where values from arr1 that were filtered) and/or [10,12]  
// (values from arr2 where values from arr1 that were filtered)

Я знаю, что код неправильный, но я не могу понять, как получить желаемый результат. Любая помощь будет признательна. Спасибо

Ответы [ 5 ]

4 голосов
/ 07 февраля 2020

Вы можете использовать map в сочетании с filter для достижения этой цели:

arr1.map((x, i) => [x,i]).filter(([x,i]) => x > 7).map(([x,i]) => i);

Это сопоставляет массив с массивом пар, где первый элемент - это исходное число, а второй - это оригинальный индекс. Затем он фильтрует пары по первому элементу каждой пары, прежде чем сопоставить их с индексами.

2 голосов
/ 07 февраля 2020

Вы можете Array#reduce и сделать это за один прогон массива, проверяя и преобразовывая данные одновременно

const arr1 = [1,3,7,9,11];

const result = arr1.reduce((acc, x, index) => acc.concat(x > 7 ? index : []), []);

console.log(result);
0 голосов
/ 07 февраля 2020

Наиболее эффективным методом будет использование reduce. Здесь я использую синтаксис расширения массива , чтобы дополнительно добавить индекс к массиву, используемому в качестве начального значения аккумулятора.

var arr1 = [1,3,7,9,11];
var indexes = arr1.reduce((acc, cur, idx) => acc = cur > 7 ? [...acc, idx] : acc, []);
console.log(indexes);
0 голосов
/ 07 февраля 2020

Просто добавьте еще один map вызов и indexOf
PS: если есть повторяющиеся значения, indexOf возвращает только первое вхождение.

В качестве альтернативы, если вы не особо разбираетесь в filter, вы можно использовать reduce, что можно сделать за одну итерацию.

const arr1 = [1,3,7,9,11];
const arr2 = [2,4,8,10,12];

const filter = arr => arr.filter(x => x > 7).map(x => arr.indexOf(x));

console.log(filter(arr1))
console.log(filter(arr2))

const filter2 = arr => arr.reduce((acc, x, i) => (x > 7 && acc.push(i), acc), []);
console.log(filter2(arr1))
console.log(filter2(arr2))
0 голосов
/ 07 февраля 2020

Вы можете сделать это так:

    var arr1 = [2,4,8,10,12];
        
    console.log(arr1.filter(x => x>7).map(m => arr1.indexOf(m)))

возвращает [2, 3, 4]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...