2010-08-25 60 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