我正在使用一个JavaScript库,它返回不以零开始的数组,比如从26或1500开始。我想做的是编写一个方法,无论索引号是否以0或其他任何数字开头,都可以获取该数组中的第一个元素。
在JavaScript中是否有这样的方法?
我正在使用一个JavaScript库,它返回不以零开始的数组,比如从26或1500开始。我想做的是编写一个方法,无论索引号是否以0或其他任何数字开头,都可以获取该数组中的第一个元素。
在JavaScript中是否有这样的方法?
我建议使用Array#some
。它可以获取数组中第一个非稀疏元素和它的索引。如果在回调函数中返回true
,则迭代会立即停止:
var a = [, , 22, 33],
value,
index;
a.some(function (v, i) {
value = v;
index = i;
return true;
});
console.log(index, value);
undefined
值也可以。 - Nina Scholzfor-in
的少数情况之一。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)) {
// ...
}
});
var min = Object.keys(theArray).reduce(function(min, n) {
var i = parseInt(n, 10);
return isNaN(i) || (min !== undefined && min > i) ? min : i;
}, undefined);
// Makes an assumption that may not be true
var min = +Object.keys(theArray).filter(isArrayIndex)[0];
Object.getOwnPropertyNames
返回的顺序,该方法需要按顺序列出数组索引。var min = +Object.getOwnPropertyNames(theArray).filter(isArrayIndex)[0];
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]);
Array#some
更多的回调调用(因为findIndex
访问稀疏元素),而且您的条件过滤掉了存在但值为undefined
的条目,而不仅仅是缺少条目。 - T.J. Crowdervoid 0
,并且它是void 0 ===“undefined”// false
,因此如果OP在数组中有“undefined”作为第一个非稀疏元素,他仍将得到它。我怀疑OP不会对此感兴趣,因为他的问题表述使我们理解他对未定义的项目不感兴趣,而稍微有可能他对“undefined”项目感兴趣。这是我的理解。 - Reduvar fullArray = array.filter(function(n){
return n != undefined;
});
fullArray[0]
filter
根本不访问它们),以及存在但值为undefined
的条目。如果您只想过滤掉缺失条目,请使用var fullArray = array.filter(function() { return true; });
。 - T.J. Crowderconst arr = [0,1,2]
// 使用解构来获取第一个元素
let [first] = arr
// 加号:使用解构获取最后一个元素
let [first] = [...arr].reverse()
使用这段代码,您可以找到第一个已分配值的索引,然后从数组中获取该值:
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]);
第一种实现使用Array.prototype.find
,这样可以减少变量的使用,因此更加简洁,但是要找到索引,您应该在数组上调用indexOf
。
但是第二种方法有点老式,但可以轻松获得索引而不需要额外的努力。
顺便说一下,Nina's 似乎更好。 (可以缩短吗?)
javascript
库?你到目前为止尝试了什么?请提供你的代码示例。 - Andrei Zhytkevich