JS数组中非null元素的最后一个索引

时间:2017-05-22 12:00:43

标签: javascript arrays indexing null

我有一个内置已定义和空值的数组,如下所示:

var arr = [
  {...},
  null,
  null,
  {...},
  null
];

有没有办法从这个数组中获取最后一个非null元素的索引? 我的意思是不必完全循环它。

4 个答案:

答案 0 :(得分:5)

您可以使用while循环并从最后进行迭代。



var array = [{ foo: 0 }, null, null, { bar: 42 }, null],
    index = array.length;
    
while (index-- && !array[index]);

console.log(index);
console.log(array[index]);




答案 1 :(得分:0)

过滤非null获取最后一个的值,如果需要索引从该值获取索引。但要求值是唯一的。

// Last non-null value
const lastNonNull = arr.filter(x => x).pop();
// Index of last non-null
const indexOfLastNonNull = arr.indexOf(lastNonNull);

<强> - 编辑(1)

您可能希望使用reduce数组方法,但在运行reverse之前要确保序列是从最后到第一个。 reduce工作得很好,第一个初始值是null然后我们检查result这是第一个初始值,所以我们传递cur这是数组的第一个元素,如果它是真实的,我们返回idx这是数组的索引,如果不是,我们返回null,它将成为下一个循环中的result

arr.reduce((result, cur, idx) => (result ? result : (cur ? idx : null)), null)

<强> - 编辑(2)

或者您可以reverse数组并运行indexOf,如下所示:

arr.indexOf(null);

一旦运行arr.reverse(),它就会反转,它会反转数组的内容。无需退货。

答案 2 :(得分:0)

试试这个:

array.length - array.slice(0).reverse().findIndex(function (el) { return el }) - 1;

答案 3 :(得分:0)

const reverse = arr => {
    let cpy = [...arr];
    cpy.reverse();
    return cpy;
};

const nonNullIndex = arr => {
    let res = arr.length - 1 - reverse(arr).findIndex(e => e !== null)

    return res === arr.length ? -1 : res;
};

这应该有效。 reverse函数返回一个数组,因为Array.prototype.reverse就地将其反转,而不返回任何内容。

nonNullIndex函数返回最后一个非空的索引。由于它会反转数组,因此必须从数组的长度中减去找到的索引。使用减法一,以便返回正确的值(因为数组的索引为0)。

如果结果等于length(意味着findIndex返回-1),则返回-1,表示数组中没有空值。否则,它返回结果。