我正在使用一个
javascript库,它返回的数组不是从零开始,如从26或1500开始,我想要做的是获取该数组中第一个元素的方法,无论索引号是从0开始还是任何其他数字.
他们是在javascript中执行此操作的方法吗?
解决方法
以下信息通常很有用,但对于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);
如果数组为空,那将给你未定义,如果不是,则给出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];