在JavaScript中找到数组中正元素的索引

时间:2018-09-22 19:20:04

标签: javascript

我想使用JS中的纯函数返回具有正元素的数组的索引数组。例如:

pos([1,-4,0,5,2])

>>[0,2,3,4]

所以,我尝试了:

  arr.map(function (ele){
   return arr.findIndex(ele => ele > 0);
  })

But my output is :[1,1,1,1]

有人可以告诉我怎么了吗?我相信我的地图函数是正确的,但是findIndex()出了点问题。 (请不要告诉我代码,因为这是我分配的问题。只需要提示即可。)

5 个答案:

答案 0 :(得分:1)

map()不太正确,因为在原始数组中每个元素都没有相应的输出。在这种情况下,reduce()可能就是您想要的:

function pos(arr){
    return arr.reduce((ret_arr, number, index) => {
        if (number >= 0) ret_arr.push(index)
        return ret_arr
    }, [])

}

console.log(pos([1,-4,0,5,2]))

答案 1 :(得分:1)

如果值是正数或-1,则可以先映射索引,然后为现有索引过滤数组。

Array#map返回带有元素索引的新数组;如果元素小于零,则返回-1

Array#filter返回不是-1的所有值。简短的加法运算只返回一个truthy值,这是一个可能的索引。

function pos(array) {
    return array                       // [1, -4, 0, 5, 2]
        .map((v, i) => v < 0 ? -1 : i) // [0, -1, 2, 3, 4]
        .filter(i => i + 1);           // [0,     2, 3, 4]
}

console.log(pos([1, -4, 0, 5, 2]));

您的映射回调

function pos(arr) {
    return arr.map(function (ele) {
        return arr.findIndex(ele => ele > 0);
    });
}

console.log(pos([1, -4, 0, 5, 2]));

不带任何元素,因为第一个ele变量以后将不再使用。然后,您总是返回arr的第一个元素的索引,即1。该值大于零,并且find的回调返回true和abd find移交实际索引。

答案 2 :(得分:1)

请勿使用findIndex。基本上你在找

function pos(arr) {
    var res = [];
    for (const [index, el] of arr.entries())
        if (el > 0)
            res.push(index)
    return res;
}

如果要使用高阶数组方法执行此操作,则可以

function pos(arr) {
    return arr.map((ele, index) => [ele, index])
              .filter(([ele]) => ele > 0)
              .map(([_, origIndex]) => origIndex);
}

@NinaScholz也有很好的方法,尽管我将其写为

function pos(arr) {
    return arr.map((ele, index) => ele > 0 ? index : null)
              .filter(index => index !== null);
}

答案 3 :(得分:0)

尝试一下:

[1,-4,0,5,2].reduce((acc,value,i) => value >= 0 ? [...acc,i] : acc,[]);

在任何情况下,您都同时要过滤和?减少永远是最好的选择。 对于此类基本算法,请尝试通过点差返回一个包含先前值的新数组。

答案 4 :(得分:0)

const Button = () => {
    return <button>Hello world</button>
}