简单值,仅返回某些数组元素而不是全部

时间:2018-11-28 10:23:34

标签: javascript

我已经制作了一个简单的变量'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]

3 个答案:

答案 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;
}, []);

实际上,filtermap可以使用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);

注意:单行并不总是更好,代码的可读性很重要,因为它有助于提高程序的可维护性。