2010-08-25 54 views
5

我有一个javascript对象数组。我使用jQuery。获取稀疏JavaScript数组的第一个元素

我该如何获得数组中的第一个元素?我不能使用数组索引 - 因为我在将对象添加到数组时分配了每个元素索引。所以索引不是0,1,2等。

只需要获取数组的第一个元素?

+1

? – 2010-08-25 23:07:39

回答

4

如果不使用顺序编号的元素,你会通过,直到你遇到第一个具有循环:

var firstIndex = 0; 
while (firstIndex < myarray.length && myarray[firstIndex] === undefined) { 
    firstIndex++; 
} 
if (firstIndex < myarray.length) { 
    var firstElement = myarray[firstIndex]; 
} else { 
    // no elements. 
} 

或某些等价傻建设。这会为您提供第一个项目的索引,您可能会也可能不会关心它。

如果这是您需要经常执行的操作,则应该对当前的第一个有效索引保留一个旁视引用,因此每次都变为O(1)操作而不是O(n)。如果您经常需要遍历真正稀疏的数组,请考虑另一个数据结构,例如将对象与其保持一致,以将有序结果反向映射到索引,或适合您的数据的东西。

+1

小心空阵列。 – Douglas 2010-08-25 23:06:50

+0

谢谢,编辑。 – 2010-08-25 23:10:49

+1

根据最低指数,这可能是非常低效的。 – Jasper 2010-08-25 23:13:46

4

filter方法适用于稀疏数组。

var first = array.filter(x => true)[0]; 
+2

-1。不正确;这并没有回答这个问题。 OP希望第一个“有效”项目,无论它在哪里(不一定是零)。 'shift'只会将元素0处的任何东西拉开,包括'undefined'。 – 2010-08-25 23:11:36

+0

我的错误,编辑替代方案,而不是添加可能误导他人的另一个答案。 – 2010-08-25 23:54:54

+0

@GeorgeJempty可能是因为它使用了“过滤器”,所以我认为“足够接近”,但你是对的。我的编辑过于激烈。 – aleclarson 2018-02-21 22:50:42

0

如果您发现自己需要对数组进行大量操作,您可能会对Underscore库感兴趣。它提供了实用方法用来操作数组,例如compact

var yourArray = []; 
yourArray[10] = "foo"; 
var firstValue = _.compact(yourArray)[0]; 

但是,它听起来就像你正在做的事情奇怪,当你构建你的阵列。也许Array.push会帮助你?

2

你有没有考虑:

function getFirstIndex(array){ 
    var result; 
    if(array instanceof Array){ 
     for(var i in array){ 
      result = i; 
      break; 
     } 
    } else { 
     return null; 
    } 
    return result; 
} 

并且以这种方式来获得最后元素数组中:

function getLastIndex(array){ 
    var result; 
    if(array instanceof Array){ 
      result = array.push(""); 
      array.pop; 
     } 
    } else { 
     return null; 
    } 
    return result; 
} 

无论这些用途的jQuery。

2

Object.keys(array)[0]返回稀疏数组中第一个元素的索引(String表单)。

var array = []; 
array[2] = true; 
array[5] = undefined; 

var keys = Object.keys(array);   // => ["2", "5"] 
var first = Number(keys[0]);    // => 2 
var last = Number(keys[keys.length - 1]); // => 5 
0

,我也面临着类似的问题而感到惊讶,没有人考虑以下几点:

var testArray = []; 
testArray [1245]= 31; 
testArray[2045] = 45; 
for(index in testArray){ 
    console.log(index+','+testArray[index]) 
} 

以上会产生

1245,31 
2045,45 

如果需要的话,你可以以后存在第一次迭代,如果所有这些都是必需的,但通常我们需要知道数组中的哪个位置开始。

1

这是一个建议与ES5方法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

您也可以使用这种可循环使用开源array-first component返回给定数组的第一个元素。

例子:您正在使用的则数组索引什么

first([1, 2, 3]) // => 1 
first(['a', 'b', 'c']) // => 'a' 
+0

他们询问**稀疏**数组,而不是普通数组。 – aleclarson 2017-12-26 14:52:42