我想使用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()出了点问题。 (请不要告诉我代码,因为这是我分配的问题。只需要提示即可。)
答案 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>
}