2010-08-25 13 views
5

Tengo una matriz de objetos en javascript. Yo uso jquery.Obtener el primer elemento de una matriz de JavaScript dispersa

¿Cómo obtengo el primer elemento de la matriz? No puedo utilizar el índice de matriz, ya que asigno cada índice de elementos cuando agrego los objetos a la matriz. Entonces los índices no son 0, 1, 2, etc.

¿Solo necesita obtener el primer elemento de la matriz?

+1

¿Qué estás usando como el índice de matriz entonces? –

Respuesta

4

Si usted no utiliza elementos numerados secuencialmente, que tendrá que recorrer hasta llegar a la primera de ellas:

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

o alguna construcción equivalentemente tonta. Esto le proporciona el índice del primer elemento, que podría o no importarle.

Si esto es algo que tiene que hacer a menudo, debe mantener una referencia inmediata al primer índice válido actual, por lo que se convierte en una operación O (1) en lugar de O (n) cada vez. Si necesita con frecuencia iterar a través de una matriz realmente dispersa, considere otra estructura de datos, como mantener un objeto a su lado que reproduzca los resultados ordinales en índices, o algo que se ajuste a sus datos.

+1

Tenga cuidado con las matrices vacías. – Douglas

+0

Gracias, editado. –

+1

Esto puede ser terriblemente ineficiente dependiendo del índice más bajo. – Jasper

4

El método filter funciona con matrices dispersas.

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

-1. Incorrecto; esto no responde la pregunta. OP quiere el primer elemento "válido", independientemente del índice en que se encuentre (no necesariamente cero). 'shift' solo sacará lo que esté en el elemento 0, incluido' undefined'. –

+0

Mi error, editado por una alternativa, en lugar de agregar otra respuesta que pueda confundir a los demás. –

+0

@GeorgeJempty Probablemente porque usó 'filter' así que pensé" lo suficientemente cerca ", pero tienes razón. Mi edición fue muy drástica. – aleclarson

0

Si ves que necesitas hacer manipulación de matrices mucho, usted podría estar interesado en la biblioteca Underscore. Proporciona métodos de utilidad para la manipulación de matrices, por ejemplo compact:

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

Sin embargo, suena como que está haciendo algo extraño cuando se está construyendo la matriz. Tal vez Array.push te ayudaría?

2

¿Ha considerado:

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

?

Y como una manera de conseguir el último elementoen la matriz:

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

ninguno de estos usos jQuery.

2

Object.keys(array)[0] devuelve el índice (en el formulario String) del primer elemento en la matriz dispersa.

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

También estaba frente a un problema similar y se sorprendió de que nadie ha considerado lo siguiente:

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

Lo anterior producirá

1245,31 
2045,45 

Si es necesario que usted podría existir después de la primera iteración si todo lo que se requería pero, en general, necesitamos saber dónde comenzar en la matriz.

1

Esta es una propuesta con el método ES5 con Array#some.

El código obtiene el primer elemento no dispersable y el índice. La iteración se detiene inmediatamente con la devolución de true en la devolución de llamada:

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

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

 
console.log(index, value);

-1

También puede utilizar esta fuente abierta reutilizable array-first component que devuelve el primer elemento de una matriz dada.

Ejemplos:

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

Preguntan acerca de una matriz ** dispersa **, no una matriz normal. – aleclarson

Cuestiones relacionadas