我已经制作了一个简单的变量'indexes
',该变量成功地标识了数组'arr
'中的索引为奇数,并且前一个值为奇数,并且不测试第一个数。但是,在定义indexs变量时,它最初返回:
[undefined, 1, 2, undefined, undefined]
然后我必须过滤出未定义的值才能实现我想要的([1,2]
)。
有没有一种方法可以做到这一点而无需过滤?我想不出办法。另外,有没有办法只返回某些元素的数组值而不是像map那样返回所有值?我以为可以使用some方法,但这只会返回一个布尔值,而不是仅包含某些项目的数组。
感谢您的帮助。我的代码如下:
let arr = ["9", "9", "9", "4", "6"];
let indexes = arr.map(function(c,i,a){if (i != 0 && c % 2 != 0 && a[i-1] % 2 != 0) {return i} }); // [undefined, 1, 2, undefined, undefined]
indexes = indexes.filter(item => item !== undefined); // [1,2]
答案 0 :(得分:3)
您可以使用reduce
函数,该函数使您可以对集合进行迭代并累积所需的任何数据:
let arr = ["9", "9", "9", "4", "6", "7"];
let indexes = arr.reduce((acc, el, index) => {
if (index != 0 && el % 2 != 0 && arr[index-1] % 2 != 0) {
acc.push(index);
}
return acc;
}, []);
实际上,filter
和map
可以使用reduce
轻松实现,因为您可以初始化一个空数组,并根据回调函数,可以将元素添加到最后数组或操纵每个元素的值。
答案 1 :(得分:1)
您可以使用数组归约功能
let arr = ["9", "9", "9", "4", "6"];
let indexes = arr.reduce(function(acc, curr, i, a) {
if (i !== 0 && curr % 2 !== 0 && a[i - 1] % 2 !== 0) {
acc.push(i);
}
return acc;
}, []);
console.log(indexes)
答案 2 :(得分:1)
是的,有一种方法可以在1行中完成 。
您可以将.reduce
与作为参数传递的累加器,元素和索引一起使用。然后,使用三元运算符替换if语句,然后使用扩展语法(...
)将值推入/追加到累加器数组中:
let arr = ["9", "9", "9", "4", "6"];
const indexes = arr.reduce((acc, elem, i) => (i != 0 && elem % 2 != 0 && arr[i-1] % 2 != 0) ? [...acc, i] : acc, []);
console.log(indexes);
注意:单行并不总是更好,代码的可读性很重要,因为它有助于提高程序的可维护性。