我使用的javascript库返回的数组不是从零开始,比如从26或1500开始,我想要做的是获取该数组中第一个元素的方法,无论索引号是从0开始或任何其他号码。
他们是否有任何方法可以在javascript中执行此操作?
答案 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()
。这些比单独的过滤器快得多,并且会保持你的数组和索引不受影响。
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;
答案 4 :(得分:0)
使用这段代码,您可以找到第一个指定的值索引,然后从数组中获取值:
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;
第一个实现使用Array.prototype.find
,这会减少变量的使用,所以这个更干净,但要找到你应该在数组上调用indexOf
的索引。
但是第二个有点过时,但是没有额外的努力就有机会获得索引。
BTW Nina's似乎更好。 (可以缩短吗?)
答案 5 :(得分:0)
const arr = [0,1,2]
//使用解构获得第一个元素
let [first] = arr
//加上:使用解构来获取最后一个元素
let [first] = [...arr].reverse()