获取索引不是从0开始的数组中的第一个元素

我正在使用一个JavaScript库,它返回的数组不是从零开始,比如从26或1500开始,我想要做的是获取该数组中第一个元素的方法,而不管以0或任何其他数字开头的索引号。

他们是否有任何方法在JavaScript中做到这一点?


以下信息通常很有用,但对于OP列出的问题,Nina的答案是更好的解决方案。


这些被称为稀疏数组,它们是您可能想要for-in数组上使用for-in的少数情况之一。

请记住,数组是JavaScript中的对象,并且数组条目是由符合特定条件的名称(数组索引)进行键控的属性。 因此,我们可以使用这些功能让我们发现对象上的属性,以查找稀疏数组上的索引。

for-in示例:

for (var n in theArray) {
    if (theArray.hasOwnProperty(n) && isArrayIndex(n)) {
        // Use theArray[n]
    }
}

这个答案显示了如何确定n是一个数组索引而不是其他属性。 一个非常技术性的定义是

function isArrayIndex(n) {
    return /^0$|^[1-9]d*$/.test(n) &&
           n <= 4294967294;
}

...但是对于我们大多数人来说,这个定义足够好

function isArrayIndex(n) {
    return !isNaN(parseInt(n, 10));
}

同样,你可以使用Object.keys ; 因为它只查看自己的枚举属性,所以不需要hasOwnProperty检查:

Object.keys(theArray).forEach(function(n) {
    if (isArrayIndex(n)) {
        // ...
    }
});

请注意, 官方没有任何特定顺序,即使在ES2015(“ES6”)中也没有。 所以从理论上讲 ,你可以看到索引超出数字顺序。 在现实世界中,我从来没有见过一个甚至是模糊现代的JavaScript引擎,它不按顺序返回数组索引。 他们不是必须的,但我尝试过的每一个人都会这样做。

所以正式的,你需要得到一个完整的列表,然后找到它的最小值:

var min = Object.keys(theArray).reduce(function(min, n) {
    var i = parseInt(n, 10);
    return isNaN(i) || (min !== undefined && min > i) ? min : i;
}, undefined);

如果数组为空,那么会给出undefined如果不是,则会给出min索引。 但是如果你想做出这样的假设,你可以按照数字顺序获得键值:

// Makes an assumption that may not be true
var min = +Object.keys(theArray).filter(isArrayIndex)[0];

如果您使用的是JavaScript引擎,这完全取决于最新的,可以依靠通过返回的顺序上Object.getOwnPropertyNames ,这需要列出数组索引秩序。

var min = +Object.getOwnPropertyNames(theArray).filter(isArrayIndex)[0];

我建议使用Array#some 。 你得到第一个非稀疏元素和索引。 如果您在回调中返回true ,则迭代立即停止:

var a = [, , 22, 33],
    value,
    index;

a.some(function (v, i) {
    value = v;
    index = i;
    return true;
});

console.log(index, value);

我想Array.prototype.some()一个替代方法是Array.prototype.findIndex()方法。 这比单独过滤要快得多,并且会保持你的数组和索引不变。

var arr = new Array(1000),
     fi = -1;
arr[777] = 1453; // now we have a nice sparse array
fi = arr.findIndex(f => f !== void 0); // void 0 is the perfect undefined
console.log(fi);
console.log(arr[fi]);
链接地址: http://www.djcxy.com/p/37763.html

上一篇: Get first element in array with index not starting from 0

下一篇: remove null values from arrays with splice