如何从javascript过滤器函数返回索引(基于值过滤)?

时间:2020-02-07 17:31:38

标签: javascript filter

我想做些看似简单的事情,但我无法弄清楚。 我想使用javascript函数'filter'在数组中查找大于某个值的值,然后返回与这些过滤后的值相对应的索引(或从另一个数组返回该索引范围内的值。

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 个答案:

答案 0 :(得分:4)

您可以将mapfilter结合使用以实现此目的:

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

这会将数组映射到成对的数组,其中第一个元素是原始编号,第二个元素是原始索引。然后,在将每个对的第一个元素映射回索引之前,对它们进行过滤。

答案 1 :(得分:2)

您可以Array#reduce并通过一次检查和转换数据一次在阵列中执行此操作

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

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

console.log(result);

答案 2 :(得分:0)

您可以这样做:

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

返回[2、3、4]

答案 3 :(得分:0)

只需添加另一个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))

答案 4 :(得分:0)

最有效的方法是使用reduce。在这里,我使用array spread syntax将索引添加到用作累加器初始值的数组中。

var arr1 = [1,3,7,9,11];
var indexes = arr1.reduce((acc, cur, idx) => acc = cur > 7 ? [...acc, idx] : acc, []);
console.log(indexes);