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

时间:2016-06-23 11:48:25

标签: javascript jquery arrays

我使用的javascript库返回的数组不是从零开始,比如从26或1500开始,我想要做的是获取该数组中第一个元素的方法,无论索引号是从0开始或任何其他号码。

他们是否有任何方法可以在javascript中执行此操作?

6 个答案:

答案 0 :(得分:5)

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



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

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

console.log(index, value);




答案 1 :(得分:2)

以下信息通常很有用,但针对所列OP的问题,Nina's answer是迄今为止更好的解决方案。

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

请记住,数组是JavaScript中的对象,数组条目是由符合certain criteria的名称(数组索引)键入的属性。因此,我们可以使用让我们发现对象属性的功能来查找稀疏数组上的索引。

for-in示例:

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

This answer显示了如何确定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 index。但是如果你想做出假设,你将按数字顺序获得密钥:

// 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];

答案 2 :(得分:1)

在数组上使用过滤函数来获取规范化数组可能很有用。

var fullArray = array.filter(function(n){
    return n != undefined;
});
fullArray[0]

这里的答案可以帮助您决定Remove empty elements from an array in Javascript

答案 3 :(得分:1)

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

&#13;
&#13;
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]);
&#13;
&#13;
&#13;

答案 4 :(得分:0)

使用这段代码,您可以找到第一个指定的值索引,然后从数组中获取值:

&#13;
&#13;
var a = [, , 22, 33];
var value = a.find((v, i) => i in a);
console.log(value);
/* ---------------------------------------------- */
var i = 0
while (!(i in a) && i < a.length) i++; // If i === a.length then the array is emtpy
console.info(i, a[i]);
&#13;
&#13;
&#13;

第一个实现使用Array.prototype.find,这会减少变量的使用,所以这个更干净,但要找到你应该在数组上调用indexOf的索引。

但是第二个有点过时,但是没有额外的努力就有机会获得索引。

BTW Nina's似乎更好。 (可以缩短吗?)

答案 5 :(得分:0)

const arr = [0,1,2]

//使用解构获得第一个元素

let [first] = arr

//加上:使用解构来获取最后一个元素

let [first] = [...arr].reverse()