2010-08-25 16 views
5

Ho una matrice di oggetti in javascript. Io uso jquery.Ottieni il primo elemento di un array sparse JavaScript

Come si ottiene il primo elemento nell'array? Non posso usare l'indice dell'array - poiché assegno ciascun indice di elementi quando aggiungo gli oggetti all'array. Quindi gli indici non sono 0, 1, 2, ecc.

Basta avere il primo elemento dell'array?

+1

Che cosa stai usando come indice di matrice allora? –

risposta

4

Se non si utilizza elementi numerate in sequenza, dovrete scorrere fino a colpire il primo:

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

o qualche costruzione equivalentemente sciocco. Questo ti fa ottenere l'indice del primo oggetto, che potresti o non vorresti importare.

Se questo è qualcosa che devi fare spesso, dovresti mantenere un riferimento a prima vista al primo indice valido corrente, quindi questa operazione diventa un'operazione O (1) invece di O (n) ogni volta. Se hai spesso bisogno di scorrere un array veramente spartoso, considera un'altra struttura di dati, come tenere un oggetto accanto a esso che esegue il back-mapping dei risultati ordinali agli indici, o qualcosa che si adatti ai tuoi dati.

+1

Attenzione agli array vuoti. – Douglas

+0

Grazie, modificato. –

+1

Questo può essere orribilmente inefficiente a seconda dell'indice più basso. – Jasper

4

Il metodo filter funziona con array sparsi.

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

-1. non corretta; questo non risponde alla domanda. OP vuole il primo oggetto "valido", qualunque sia l'indice (non necessariamente zero). 'shift' rimuoverà solo ciò che è all'elemento 0, incluso' undefined'. –

+0

Il mio errore, modificato per un'alternativa, piuttosto che aggiungere un'altra risposta che potrebbe fuorviare gli altri. –

+0

@GeorgeJempty Probabilmente perché ha usato 'filter' quindi ho pensato" abbastanza vicino ", ma hai ragione. La mia modifica era troppo drastica. – aleclarson

0

Se vi trovate a dover fare la manipolazione di array molto, potreste essere interessati nella biblioteca Underscore. Esso fornisce metodi di utilità per gli array che manipolano, ad esempio compact:

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

Tuttavia, suona come si sta facendo qualcosa di strano quando si sta costruendo la matrice. Forse Array.push ti aiuterebbe?

2

Avete considerato:

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

?

e come un modo per ottenere l'ultimo elementonella matrice:

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

Nessuno di questi usi jquery.

2

Object.keys(array)[0] restituisce l'indice (nel modulo String) del primo elemento nell'array sparse.

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

Sono stato anche di fronte a un problema simile e sono rimasto sorpreso che nessuno ha preso in considerazione la seguente:

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

È possibile che questo produrrà

1245,31 
2045,45 

, se necessario, si potrebbe esistere dopo la prima iterazione se tutto ciò era necessario, ma in generale è necessario sapere dove iniziare la matrice.

1

Questa è una proposta con metodo ES5 con Array#some.

Il codice ottiene il primo elemento non lineare e l'indice. L'iterazione arresta immediatamente con ritorno true nella callback:

var a = [, , 22, 33], 
 
    value, 
 
    index; 
 

 
a.some(function (v, i) { 
 
    value = v; 
 
    index = i; 
 
    return true; 
 
}); 
 

 
console.log(index, value);

-1

È anche possibile utilizzare questo riutilizzabile source array-first component che restituisce il primo elemento di un dato array.

Esempi:

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

Chiedono un array ** sparse **, non un array normale. – aleclarson

Problemi correlati