【问题标题】:JS Last index of a non-null element in an arrayJS数组中非空元素的最后索引
【发布时间】:2017-10-22 01:55:37
【问题描述】:

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

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

有什么方法可以让我从这个数组中获取最后一个非空元素的索引吗? 我的意思是不必完全循环。

【问题讨论】:

    标签: javascript arrays indexing null


    【解决方案1】:

    您可以使用 while 循环并从末尾进行迭代。

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

    【讨论】:

    • 已经想到了,求一个没有循环的方法。
    • 实际上,你需要一个循环或某种循环,比如内置数组方法,但它们只是从头开始循环,reduceRight 没有提前退出。
    • 所以我想没有循环就没有办法做到这一点......我在想非空元素可能有一个 .index 。感谢您的尝试。
    【解决方案2】:

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

    // 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 这是数组的第一个元素,如果它是真的,我们返回@ 987654328@是数组的索引,如果不是我们返回null,它将成为下一个循环中的result

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

    --编辑(2)

    或者您可以reverse 数组并像这样运行indexOf

    arr.indexOf(null);
    

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

    【讨论】:

    • 我真的不明白你的 .filter() 如何过滤掉空元素。能详细说明一下吗?
    • 当然,要检查一个变量是null 还是undefined,你可以简单地用一个truthy 检查它,在JS 中就像我写的示例中的if (variableX) ... 它是相同的情况,条件基本上是变量本身,所以如果xnullundefined 它返回false,并且不会包含在返回中。请记住,胖箭头函数=> 用于在这种情况下返回表达式而不编写整个函数。
    • 更详细地说,过滤器粗箭头相当于filter( function(x) { return x; } )
    • filter 访问数组的每个元素。
    • 谢谢,我现在明白了。但如前所述,遍历数组的每个元素并不是一个好主意,它最多可以包含 10 000 个条目。
    【解决方案3】:
    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)。

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

    【讨论】:

      【解决方案4】:

      试试这个:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-17
        • 2017-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多