¿Cómo obtener el primer elemento de una matriz?


236

¿Cómo se obtiene el primer elemento de una matriz como esta:

var ary = ['first', 'second', 'third', 'fourth', 'fifth'];

Intenté esto:

alert($(ary).first());

Pero volvería [object Object]. Entonces necesito obtener el primer elemento de la matriz, que debería ser el elemento 'first'.


2
Recomiendo ordenar las respuestas por activo
leonheess

Respuestas:


338

Me gusta esto

alert(ary[0])

35
var a = []; a[7] = 'foo'; alert(a[0]);
Petah

72
Esto supone que el primer elemento de la matriz siempre tiene un índice de 0. Sabes lo que dicen sobre el supuesto ...
Andy

16
@Andy No hubo suposiciones, ya que la pregunta de OP era bastante clara y específica.
John Hartsock

55
@Petah, no hay nada de malo en ese código. Simplemente se muestra indefinido, ya que ese es el valor de un [0], que en realidad es el primer elemento de la matriz. Si desea que se muestre foo, debe omitir todos los valores indefinidos, pero no sería el primer elemento de la matriz.
Michiel van der Blonk

55
@MichielvanderBlonk Simplemente estaba señalando un caso extremo que algunos usuarios podrían no esperar.
Petah


92

Algunas de las formas a continuación para diferentes circunstancias.

En la mayoría de los casos normales, la forma más sencilla de acceder al primer elemento es mediante

yourArray[0]

pero esto requiere que verifique si [0] realmente existe.

Hay casos del mundo real en los que no le importa la matriz original y no desea verificar si existe un índice, solo desea obtener el primer elemento o una línea no definida.

En este caso, puede usar shift () método para obtener el primer elemento, pero tenga cuidado de que este método modifique la matriz original (elimine el primer elemento y lo devuelva). Por lo tanto, la longitud de una matriz se reduce en uno. Este método se puede usar en casos en línea donde solo necesita obtener el primer elemento, pero no le importa la matriz original.

yourArray.shift()

Lo importante es saber que los dos anteriores son solo una opción si su matriz comienza con un índice [0].

Hay casos en los que se ha eliminado el primer elemento, por ejemplo, eliminar yourArray [0] dejando su matriz con "agujeros". Ahora el elemento en [0] simplemente no está definido, pero desea obtener el primer elemento "existente". He visto muchos casos del mundo real de esto.

Entonces, suponiendo que no tenemos conocimiento de la matriz y la primera clave (o sabemos que hay agujeros), aún podemos obtener el primer elemento.

Puede usar find () para obtener el primer elemento.

La ventaja de find () es su eficiencia, ya que sale del bucle cuando se alcanza el primer valor que satisface la condición (más sobre esto a continuación). (Puede personalizar la condición para excluir valores nulos u otros valores vacíos también)

var firstItem = yourArray.find(x=>x!==undefined);

También me gustaría incluir filter () aquí como una opción para "arreglar" primero la matriz en la copia y luego obtener el primer elemento manteniendo intacta la matriz original (sin modificar).

Otra razón para incluir filter () aquí es que existía antes de find () y muchos programadores ya lo han estado usando (es ES5 contra find () como ES6).

var firstItem = yourArray.filter(x => typeof x!==undefined).shift();

Advertencia de que filter () no es realmente una forma eficiente (filter () se ejecuta a través de todos los elementos) y crea otra matriz. Está bien usarlo en matrices pequeñas ya que el impacto en el rendimiento sería marginal, más cercano al uso de forEach, por ejemplo.

(Veo que algunas personas sugieren usar for ... in loop para obtener el primer elemento, pero recomendaría este método para ... in no debería usarse para iterar sobre una matriz donde el orden del índice es importante porque no lo hace ' No garantiza el pedido, aunque puede argumentar que los navegadores respetan el orden en su mayoría. Por cierto, porque cada uno no resuelve el problema como muchos sugieren porque no puede romperlo y se ejecutará a través de todos los elementos. Sería mejor usar un simple para bucle y comprobando clave / valor

Tanto find () como filter () garantizan el orden de los elementos, por lo que son seguros de usar como se indicó anteriormente.


1
¿Por qué no simplemente quitar la matriz después, por ejemplo: var element = yourArray.shift (); yourArray.unshift (elemento);
Greg

99
Porque es muy ineficiente y malo. Puede obtener el primer elemento de una manera mucho más eficiente. Tanto shift como unshift hacen algunas comprobaciones y atraviesan toda la matriz para lograr la tarea porque cuando eliminas o agregas un nuevo elemento al principio, todos los demás índices deben desplazarse. Es como si tuvieras un autobús lleno de gente, y cuando alguien del asiento trasero quiere bajarse, vacías el autobús por la puerta principal y luego les pides que suban nuevamente.
Selay

1
@Selay que depende de los aspectos internos específicos del intérprete.
Michiel van der Blonk

@Michiel van der Blonk ¿Puede decirme qué intérprete lo hace como mencionó? Estoy muy interesado. Todas las implementaciones que conozco usan loop y copy. Es cómo funcionan las matrices de JavaScript. No puede simplemente eliminar el primer elemento fácilmente porque la matriz restante ahora comienza desde 1 (elemento en la posición 0 eliminado), que debe corregir. No puedes hacer magia sin importar qué implementación interna tengas.
Selay

Si lo usa yourArray.map(n=>n).shift(), devolverá el primer elemento sin modificar el original ... no sé si es la mejor manera, pero si encadena una matriz con .map (). Filter (). Some (). Shift () está bien .. de lo contrario usaríayourArray[0]
Michael J. Zoidl

53

Usando la desestructuración ES6

let [first] = [1,2,3];

Que es lo mismo que

let first = [1,2,3][0];

Puede ser relevante agregar que Destruir es solo una opción si su matriz comienza con un índice [0].
leonheess

53

El elemento del índice 0 puede no existir si el primer elemento ha sido eliminado:

let a = ['a', 'b', 'c'];
delete a[0];

for (let i in a) {
  console.log(i + ' ' + a[i]);
}

Mejor manera de obtener el primer elemento sin jQuery:

function first(p) {
  for (let i in p) return p[i];
}

console.log( first(['a', 'b', 'c']) );


1
a.entries () [0] debería hacerlo :)
Edson Medina

1
Esto se debe a que no debe usar ese tipo de enumeración con una matriz, ya que enumera objetos y no miembros de la matriz. Utilice la indexación con un bucle for tradicional en su lugar.
Oskar Duveborn

Enfoque ES6 similar (que tampoco depende de índices numéricos) aquí: stackoverflow.com/a/56115413/7910454
leonheess

46

Si desea preservar la legibilidad , siempre puede agregar una primera función a Array.protoype:

Array.prototype.first = function () {
    return this[0];
};

A, entonces podría recuperar fácilmente el primer elemento:

[1, 2, 3].first();
> 1

14
se considera una muy mala práctica jugar con prototipos de clases base de alguna manera por una buena razón.
Dmitry Matveev

11
eso es tonto, ¿cómo es .first()mejor escribir que hacer [0]?
jonschlinkert

10
@jonschlinkert Algunos idiomas tienen índices que comienzan en 1. firstes inequívoco en ese caso.
Bartek Banachewicz

66
¿Qué devuelve [] .first ()?
Rhyous

1
En mi prueba, vuelve indefinido. Estoy tratando de decidir si me gusta que regrese indefinido.
Rhyous

33

Solo puedes usar find():

let first = array.find(Boolean);

O si quieres el primer elemento, incluso si es falso :

let first = array.find(e => true);

Ir más allá:

Si le interesa la legibilidad pero no desea confiar en incidencias numéricas, puede agregar una first()función Array.protoypedefiniéndola con la Object​.define​Property()que mitigue los inconvenientes de modificar directamente el prototipo de objeto Array incorporado ( explicado aquí ).

El rendimiento es bastante bueno (se find()detiene después del primer elemento) pero no es perfecto ni universalmente accesible (solo ES6) Para obtener más información, lea la respuesta de @Selays .

Object.defineProperty(Array.prototype, 'first', {
  value() {
    return this.find(e => true);     // or this.find(Boolean)
  }
});

Luego, para recuperar el primer elemento que puede hacer:

let array = ['a', 'b', 'c'];
array.first();

> 'a'

Fragmento para verlo en acción:

Object.defineProperty(Array.prototype, 'first', {
  value() {
    return this.find(Boolean);
  }
});

console.log( ['a', 'b', 'c'].first() );


3
Esta es la mejor y más actualizada respuesta. Estaba a punto de publicar aquí lo mismo, pero después de ver el tuyo :)
Kostanos

¿Y qué sucede si en una versión futura del lenguaje agregarán find ()? :-) ¿No lo rompería el fragmento anterior?
Bogdan

@Bogdan ¿Qué quieres decir cuando agregaránfind() ? find()Ha sido durante mucho tiempo parte del lenguaje. Es la razón por la que funciona el fragmento anterior.
leonheess

Ohh Lo siento un poco cansado, no he dormido mucho a lo que me refería primero.
Bogdan

@Bogdan Todavía funcionaría perfectamente bien, pero sobrescribiría el futuro potencial - first()método del lenguaje
leonheess

18

Si no se garantiza que su matriz se llene desde el índice cero, puede usar Array.prototype.find():

var elements = []
elements[1] = 'foo'
elements[2] = 'bar'

var first = function(element) { return !!element }    
var gotcha = elements.find(first)

console.log(a[0]) // undefined
console.log(gotcha) // 'foo'

3
Esto realmente debería ser votado más alto. Es la solución más concisa que veo que usa vanilla js y representa matrices dispersas.
Dominic P


1
Aconsejaría no usarlo, !!elementya que omitirá los valores falsos. Recomiendo usar find()de esta manera:sparse.find((_, index, array) => index in array);
Victor Welling

Enfoque similar sin descartar los valores falsos aquí: stackoverflow.com/a/56115413/7910454
leonheess

13
array.find(e => !!e);  // return the first element 

dado que "buscar" devuelve el primer elemento que coincide con el filtro && !!e coincide con cualquier elemento.

Nota Esto sólo funciona cuando el primer elemento no es un "Falsy": null, false, NaN, "", 0,undefined


1
Abdennour para aclarar a los demás su condición coincide con cualquier elemento verdadero, es decir, <code> const example = [null, NaN, 0, undefined, {}, 3, 'a']; const firstTruthyElement = ejemplo.find (e => !! e); // asigna el quinto elemento, el primer no falso: {} </code>
PDA

Gracias @PDA por ponerse al día. Por cierto, la cadena vacía también se considera falsa
Abdennour TOUMI

3
Esto es genial y también funciona muy bien en TypeScript. ¿Qué hay de simplificar a array.find(() => true);? Esto te permite hacerlo [false].find(() => true)también.
Simon Warta

@SimonWarta por supuesto .find(value => true) está funcionando como se esperaba ... pero, sinceramente, si desea un código más limpio y para seguir escribiendo en mecanografiado, use la desestructuración .
Flavien Volken

Vea esta respuesta de una manera similar sin las trampas de ignorar elementos
falsos



7

Sé que las personas que vienen de otros idiomas a JavaScript, buscan algo como head()ofirst() para obtener el primer elemento de una matriz, pero ¿cómo pueden hacerlo?

Imagina que tienes la matriz a continuación:

const arr = [1, 2, 3, 4, 5];

En JavaScript, simplemente puedes hacer:

const first = arr[0];

o una forma más ordenada y nueva es:

const [first] = arr;

Pero también puedes simplemente escribir una función como ...

function first(arr) {
   if(!Array.isArray(arr)) return;
   return arr[0];
}

Si usa subrayado, hay una lista de funciones que hacen lo mismo que busca:

_.first 

_.head

_.take

6

Método que funciona con matrices , y también funciona con objetos (¡cuidado, los objetos no tienen un orden garantizado!).

Prefiero más este método, porque la matriz original no se modifica.

// In case of array
var arr = [];
arr[3] = 'first';
arr[7] = 'last';
var firstElement;
for(var i in arr){
    firstElement = arr[i];
    break;
}
console.log(firstElement);  // "first"

// In case of object
var obj = {
    first: 'first',
    last: 'last',
};

var firstElement;

for(var i in obj){
    firstElement = obj[i];
    break;
}

console.log(firstElement) // First;


4

Otro para aquellos que solo se preocupan por los elementos de verdad.

ary.find(Boolean);

4

Encuentre el primer elemento en una matriz usando un filtro:

En mecanografiado:

function first<T>(arr: T[], filter: (v: T) => boolean): T {
    let result: T;
    return arr.some(v => { result = v; return filter(v); }) ? result : undefined;
}

En javascript simple:

function first(arr, filter) {
    var result;
    return arr.some(function (v) { result = v; return filter(v); }) ? result : undefined;
}

Y de manera similar, indexOf:

En mecanografiado:

function indexOf<T>(arr: T[], filter: (v: T) => boolean): number {
    let result: number;
    return arr.some((v, i) => { result = i; return filter(v); }) ? result : undefined;
}

En javascript simple:

function indexOf(arr, filter) {
    var result;
    return arr.some(function (v, i) { result = i; return filter(v); }) ? result : undefined;
}

3

Cuando hay varias coincidencias, el .first () de JQuery se usa para recuperar el primer elemento DOM que coincide con el selector css dado a jquery.

No necesita jQuery para manipular matrices de JavaScript.


3

¿Por qué no tener en cuenta las veces que su matriz podría estar vacía?

var ary = ['first', 'second', 'third', 'fourth', 'fifth'];
first = (array) => array.length ? array[0] : 'no items';
first(ary)
// output: first

var ary = [];
first(ary)
// output: no items

3

Solo usa ary.slice(0,1).pop();

En

var ary = ['first', 'second', 'third', 'fourth', 'fifth'];

console.log("1º "+ary.slice(0,1).pop());
console.log("2º "+ary.slice(0,2).pop());
console.log("3º "+ary.slice(0,3).pop());
console.log("4º "+ary.slice(0,4).pop());
console.log("5º "+ary.slice(0,5).pop());
console.log("Last "+ary.slice(-1).pop());

array.slice (START, END) .pop ();


¿Por qué esto y no ary[0]?
nathanfranke

2

También podría usar .get (0):

alert($(ary).first().get(0));

Para obtener el primer elemento de la matriz.


1

Use esto para dividir caracteres en javascript.

var str = "boy, girl, dog, cat";
var arr = str.split(",");
var fst = arr.splice(0,1).join("");
var rest = arr.join(",");

1

Los ejemplos anteriores funcionan bien cuando el índice de matriz comienza en cero. La respuesta de thomax no se basó en el índice que comienza en cero, sino en el Array.prototype.findque no tuve acceso. La siguiente solución usando jQuery $ .each funcionó bien en mi caso.

let haystack = {100: 'first', 150: 'second'},
    found = null;

$.each(haystack, function( index, value ) {
    found = value;  // Save the first array element for later.
    return false;  // Immediately stop the $.each loop after the first array element.
});

console.log(found); // Prints 'first'.

1

Puedes hacerlo por lodash _.head tan fácilmente.

var arr = ['first', 'second', 'third', 'fourth', 'fifth'];
console.log(_.head(arr));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>


2
Es, literalmente, hace arr[0]como se puede ver aquí, que es por lo fuertemente desalentar el uso de una biblioteca gigantesca como lodash para una pequeña tarea.
leonheess

1

var ary = ['first', 'second', 'third', 'fourth', 'fifth'];
alert(Object.values(ary)[0]);


Esto es vanilla JS, no jQuery, no libs, no-nothing ...: P ... funcionará si el índice de matriz no comienza en cero, funcionará si el mundo no ha terminado ...
Merak Marey

0

@NicoLwk Debe eliminar elementos con empalme, que desplazarán su matriz hacia atrás. Entonces:

var a=['a','b','c'];
a.splice(0,1);
for(var i in a){console.log(i+' '+a[i]);}

2
Esta respuesta es un comentario a la respuesta anterior (NicoLwks), y debe eliminarse
Lino

0

Declare un prototipo para obtener el primer elemento de matriz como:

Array.prototype.first = function () {
   return this[0];
};

Luego úsalo como:

var array = [0, 1, 2, 3];
var first = array.first();
var _first = [0, 1, 2, 3].first();

O simplemente (:

first = array[0];

0

Si está encadenando una vista de funciones a la matriz, por ejemplo

array.map(i => i+1).filter(i => i > 3)

Y si desea el primer elemento después de estas funciones, simplemente puede agregar un .shift()no modifica el original array, es una mejor maneraarray.map(i => i+1).filter(=> i > 3)[0]

Si desea el primer elemento de una matriz sin modificar el original, puede usar array[0]o array.map(n=>n).shift()(sin el mapa, modificará el original. En este caso, sugeriría la ..[0]versión).


0
var ary = ['first', 'second', 'third', 'fourth', 'fifth'];

console.log(Object.keys(ary)[0]);

Haga cualquier matriz de objetos ( req), luego simplemente Object.keys(req)[0]elija la primera clave en la matriz de objetos.


2
Si bien este fragmento de código puede resolver la pregunta, incluir una explicación realmente ayuda a mejorar la calidad de su publicación. Recuerde que está respondiendo la pregunta para los lectores en el futuro, y que esas personas podrían no conocer los motivos de su sugerencia de código.
DimaSan

0

La respuesta de @thomax es bastante buena, pero fallará si el primer elemento de la matriz es falso o falso-y (0, cadena vacía, etc.). Es mejor volver verdadero para cualquier cosa que no sea indefinida:

const arr = [];
arr[1] = '';
arr[2] = 'foo';

const first = arr.find((v) => { return (typeof v !== 'undefined'); });
console.log(first); // ''

-1

ES6 fácil:

let a = []
a[7] = 'A'
a[10] = 'B'

let firstValue = a.find(v => v)
let firstIndex = a.findIndex(v => v)

1
No ... devolverá el primer valor definido. Si el primero es nulo, indefinido, falso, 0 o una cadena vacía, se omitirá esa. Prueba:[false, 0, null, undefined, '', 'last'].find(v => v)
Flavien Volken,

Buen punto, mi solución funciona solo para una matriz con valores definidos.
Jan Jarčík

1
Entonces, ¿por qué filtrar usando el valor? a.find(value => true)no descartará ningún valor. Aún así, no recomiendo usar find para obtener el primer elemento.
Flavien Volken el

1
@ MiXT4PE devolver verdadero (como en su respuesta) está bien porque se detendrá en el primer elemento, aquí devuelve el elemento en sí ... que continuará si ese se considera falso
Flavien Volken

1
@ MiXT4PE usando "find" es más lento, más complicado y menos elegante. También dudo que haya algún editor inteligente capaz de refactorizar esta operación. El uso de la desestructuración es mucho más eficiente, entendido por el lenguaje (para que pueda refactorizar), el compilador entiende el tipo (en el caso de TS), y muy probablemente la solución más rápida.
Flavien Volken
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.