获取索引不是从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