Come ottenere il primo elemento di un array?


236

Come si ottiene il primo elemento da un array come questo:

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

Ho provato questo:

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

Ma sarebbe tornato [object Object]. Quindi ho bisogno di ottenere il primo elemento dall'array che dovrebbe essere l'elemento 'first'.


2
Consiglio vivamente di ordinare le risposte per attivo
leonheess,

Risposte:


338

come questo

alert(ary[0])

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

72
Ciò presuppone che il primo elemento dell'array abbia sempre un indice di 0. Sai cosa dicono dell'assunzione ...
Andy,

16
@Andy Non c'erano ipotesi, poiché la domanda di OP era abbastanza chiara e specifica.
John Hartsock,

5
@Petah non c'è niente di sbagliato in quel codice. Mostra semplicemente indefinito, poiché questo è il valore di uno [0], che in realtà è il primo elemento dell'array. Se vuoi che mostri foo, dovresti saltare tutti i valori non definiti ma non sarebbe il primo elemento nella matrice.
Michiel van der Blonk,

5
@MichielvanderBlonk Stavo semplicemente sottolineando un caso limite che alcuni utenti potrebbero non aspettarsi.
Petah,


92

Alcuni dei modi seguenti per diverse circostanze.

Nella maggior parte dei casi normali, è il modo più semplice per accedere al primo elemento

yourArray[0]

ma questo richiede di verificare se [0] esiste realmente.

Ci sono casi del mondo reale in cui non ti interessa l'array originale e non vuoi controllare se esiste un indice, vuoi solo ottenere il primo elemento o non definito in linea.

In questo caso, puoi usare il metodo shift () per ottenere il primo elemento, ma fai attenzione che questo metodo modifica l'array originale (rimuove il primo elemento e lo restituisce). Pertanto la lunghezza di un array è ridotta di uno. Questo metodo può essere utilizzato nei casi inline in cui è sufficiente ottenere il primo elemento, ma non ti interessa l'array originale.

yourArray.shift()

La cosa importante da sapere è che i due precedenti sono solo un'opzione se l'array inizia con un indice [0].

Ci sono casi in cui il primo elemento è stato eliminato, ad esempio, elimina yourArray [0] lasciando l'array con "buchi". Ora l'elemento in [0] è semplicemente indefinito, ma vuoi ottenere il primo elemento "esistente". Ho visto molti casi reali di questo.

Quindi, supponendo che non abbiamo conoscenza dell'array e della prima chiave (o sappiamo che ci sono buchi), possiamo ancora ottenere il primo elemento.

Puoi usare find () per ottenere il primo elemento.

Il vantaggio di find () è la sua efficienza quando esce dal loop quando viene raggiunto il primo valore che soddisfa la condizione (maggiori informazioni su questo sotto). (È possibile personalizzare la condizione per escludere anche valori null o altri valori vuoti)

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

Vorrei anche includere filter () qui come opzione per prima "riparare" l'array nella copia e quindi ottenere il primo elemento mantenendo intatto l'array originale (non modificato).

Un altro motivo per includere filter () qui è che esisteva prima di find () e molti programmatori lo hanno già usato (è ES5 contro find () essendo ES6).

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

Avviso che filter () non è in realtà un modo efficiente (filter () scorre attraverso tutti gli elementi) e crea un altro array. Va bene usare su array di piccole dimensioni poiché l'impatto sulle prestazioni sarebbe marginale, più vicino all'uso di ForEach, ad esempio.

(Vedo alcune persone suggerire di usare for ... in loop per ottenere il primo elemento, ma sconsiglio questo metodo per ... in non dovrebbe essere usato per iterare su una matrice in cui l'ordine dell'indice è importante perché non lo fa ' garantiamo l'ordine anche se puoi sostenere che i browser rispettano principalmente l'ordine. A proposito, ogni soluzione non risolve il problema come molti suggeriscono perché non puoi romperlo e scorrerà tutti gli elementi. Sarebbe meglio usare un semplice per loop e controllando chiave / valore

Find () e filter () garantiscono l'ordine degli elementi, quindi sono sicuri da usare come sopra.


1
Perché non spostare l'array in seguito, ad esempio: var element = yourArray.shift (); yourArray.unshift (elemento);
Greg,

9
Perché è una cosa molto inefficiente e cattiva. Puoi ottenere il primo elemento in modo molto efficiente. Sia shift che unshift eseguono alcuni controlli e attraversano l'intero array per raggiungere l'attività poiché quando si rimuove o si aggiunge un nuovo elemento all'inizio, tutti gli altri indici devono essere spostati. È come se avessi un autobus pieno di gente e quando qualcuno dal sedile posteriore vuole scendere, svuoti l'autobus dalla porta principale e poi chiedi loro di salire di nuovo.
Selay,

1
@Selay che dipende dagli interni specifici dell'interprete.
Michiel van der Blonk,

@Michiel van der Blonk Puoi per favore farmi sapere quale interprete lo fa come hai detto. Sono molto interessato. Tutte le implementazioni a me note usano loop e copia. È come funzionano le matrici JavaScript. Non puoi semplicemente rimuovere facilmente il primo elemento perché l'array rimanente ora inizia da 1 (elemento nella posizione 0 rimosso), che devi correggere. Non puoi fare magie indipendentemente dall'implementazione interna che hai.
Selay,

Se lo usi yourArray.map(n=>n).shift(), restituirà il primo elemento senza modificare l'originale ... non so se è il modo migliore, ma se fai una catena con .map (). Filter (). Some (). Shift (), va bene .. altrimenti yourArray[0]
userei

53

Utilizzo della destrutturazione ES6

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

Che è lo stesso di

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

Potrebbe essere rilevante aggiungere che la distruzione è un'opzione solo se l'array inizia con un indice [0].
leonheess,

53

L'elemento dell'indice 0 potrebbe non esistere se il primo elemento è stato eliminato:

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

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

Modo migliore per ottenere il primo elemento senza jQuery:

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

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


1
a.entries () [0] dovrebbe farlo :)
Edson Medina,

1
Questo perché non dovresti usare quel tipo di enumerazione con una matrice, poiché sta enumerando oggetti e non membri della matrice. Utilizzare invece l'indicizzazione con un ciclo for tradizionale.
Oskar Duveborn,

Approccio simile ES6 (anche non basandosi su indici numerici) qui: stackoverflow.com/a/56115413/7910454
leonheess

46

Se si desidera preservare la leggibilità, è sempre possibile aggiungere una prima funzione a Array.protoype:

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

A allora potresti facilmente recuperare il primo elemento:

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

14
è considerato una brutta pratica armeggiare con prototipi di classi base in alcun modo per una buona ragione.
Dmitry Matveev il

11
è sciocco, come è .first()meglio scrivere che fare [0]?
jonschlinkert,

10
@jonschlinkert Alcune lingue hanno indici che iniziano da 1. firstè inequivocabile in quel caso.
Bartek Banachewicz,

6
cosa restituisce [] .first ()?
Rhyous,

1
Nel mio test ritorna indefinito. Sto cercando di decidere se mi piace tornare indefinito.
Rhyous,

33

Puoi semplicemente usare find():

let first = array.find(Boolean);

O se vuoi il primo elemento anche se è falso :

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

Andare il miglio supplementare:

Se vi preoccupate per la leggibilità, ma non si vuole fare affidamento su incidenze numerici si potrebbe aggiungere un first()-funzione per Array.protoypedefinendo con Object​.define​Property()che mitiga le insidie di modificare il built-in Array oggetto prototipo direttamente ( spiegate qui ).

Le prestazioni sono piuttosto buone (si find()fermano dopo il primo elemento) ma non sono perfette o universalmente accessibili (solo ES6). Per ulteriori informazioni leggi la risposta @Selays .

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

Quindi per recuperare il primo elemento puoi fare:

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

> 'a'

Snippet per vederlo in azione:

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

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


3
Questa è la risposta migliore e più aggiornata. Stavo per pubblicare qui lo stesso, ma dopo aver visto i tuoi :)
Kostanos,

E cosa succede se in una versione futura della lingua aggiungeranno find ()? :-) il frammento sopra non lo spezzerebbe?
Bogdan,

@Bogdan Cosa intendi quando aggiungerannofind() ? find()è stato a lungo parte della lingua. È il motivo per cui il frammento di cui sopra funziona.
leonheess,

Ohh. Mi spiace un po 'stanco non ho dormito molto a cui mi riferivo per primo.
Bogdan,

@Bogdan Funzionerebbe ancora perfettamente ma sovrascrivere il potenziale first()metodo futuro della lingua
leonheess,

18

Se non si garantisce che l'array sia popolato dall'indice zero, è possibile utilizzare 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
Questo dovrebbe davvero essere votato più in alto. È la soluzione più concisa che vedo che utilizza js vanilla e tiene conto di array sparsi.
Dominic P


1
Sconsiglio di utilizzare !!elementin quanto salterà i valori falsi. Consiglierei di utilizzare find()in questo modo:sparse.find((_, index, array) => index in array);
Victor Welling,

Approccio simile senza che respinge valori falsy qui: stackoverflow.com/a/56115413/7910454
leonheess

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

poiché "trova" restituisce il primo elemento corrispondente al filtro && !!e corrisponde a qualsiasi elemento.

Nota Questo funziona solo quando il primo elemento non è un "Falsy": null, false, NaN, "", 0,undefined


1
Abdennour per chiarire agli altri che la tua condizione corrisponde a qualsiasi elemento di verità, cioè <code> const example = [null, NaN, 0, undefined, {}, 3, 'a']; const firstTruthyElement = example.find (e => !! e); // assegna il 5 ° elemento, il primo non falso: {} </code>
PDA

Grazie @PDA per il recupero. A proposito, la stringa vuota è considerata anche falsa
Abdennour TOUMI

3
questo è fantastico e funziona benissimo anche in TypeScript. Che ne dici di semplificare array.find(() => true);? Questo ti permette anche di fare [false].find(() => true).
Simon Warta,

@SimonWarta ovviamente .find(value => true)funziona come previsto ... ma onestamente se vuoi un codice più pulito e mantenere la digitazione in dattiloscritto, usa la destrutturazione .
Flavien Volken,

Vedi questa risposta per un modo simile senza le insidie ​​dell'ignorare elementi
falsi



7

Conosco persone che provengono da altre lingue su JavaScript e cercano qualcosa di simile head()ofirst() ottengono il primo elemento di un array, ma come puoi farlo?

Immagina di avere l'array di seguito:

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

In JavaScript, puoi semplicemente fare:

const first = arr[0];

o più ordinato, il modo più recente è:

const [first] = arr;

Ma puoi anche semplicemente scrivere una funzione come ...

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

Se si utilizza il trattino basso, ci sono un elenco di funzioni che fanno la stessa cosa che stai cercando:

_.first 

_.head

_.take

6

Metodo che funziona con le matrici e funziona anche con gli oggetti (attenzione, gli oggetti non hanno un ordine garantito!).

Preferisco di più questo metodo, perché l'array originale non viene modificato.

// 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

Un altro per quelli che si occupano solo di elementi sinceri

ary.find(Boolean);

4

Trova il primo elemento in un array usando un filtro:

In dattiloscritto:

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

In javascript semplice:

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

E allo stesso modo, indexOf:

In dattiloscritto:

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;
}

In javascript semplice:

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

3

Quando ci sono più corrispondenze, il .first () di JQuery viene usato per recuperare il primo elemento DOM che corrispondeva al selettore css dato a jquery.

Non è necessario jQuery per manipolare le matrici JavaScript.


3

Perché non tenere conto delle volte in cui l'array potrebbe essere vuoto?

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

Basta usare ary.slice(0,1).pop();

Nel

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 ();


Perché questo e no ary[0]?
nathanfranke,

2

Puoi anche usare .get (0):

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

Per ottenere il primo elemento dell'array.


1

Usa questo per dividere il personaggio in javascript.

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

1

Gli esempi precedenti funzionano bene quando l'indice dell'array inizia da zero. La risposta di Thomax non si basava sull'indice a partire da zero, ma si basava su Array.prototype.findcui non avevo accesso. La seguente soluzione che utilizza jQuery $ .each ha funzionato bene nel mio 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

Puoi farlo da lodash _.head così facilmente.

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
Fa letteralmente arr[0]come puoi vedere qui, motivo per cui scoraggio fortemente l' uso di una gigantesca biblioteca come lodash per un compito così piccolo.
Leonessa

1

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


Questo è JS vaniglia, niente jQuery, niente librerie, niente di niente ..: P..it funzionerà se l'indice di array non parte da zero, funzionerà se il mondo non è finito ....
Merak Marey,

0

@NicoLwk Dovresti rimuovere gli elementi con giunzione, che sposteranno indietro l'array. Così:

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

2
Questa risposta è un commento alla risposta Aboves (NicoLwks) e dovrebbe essere eliminata
Lino,

0

Dichiarare un prototipo per ottenere il primo elemento dell'array come:

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

Quindi usalo come:

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

O semplicemente (:

first = array[0];

0

Se si sta concatenando una vista funzioni all'array, ad es

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

E vuoi il primo elemento dopo queste funzioni puoi semplicemente aggiungere un .shift()che non modifica l'originale array, quindi è un modo migliorearray.map(i => i+1).filter(=> i > 3)[0]

Se si desidera il primo elemento di un array senza modificare l'originale, è possibile utilizzare array[0]o array.map(n=>n).shift()(senza la mappa si modificherà l'originale. In questo caso, suggerirei la ..[0]versione.


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

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

Crea qualsiasi array di oggetti ( req), quindi semplicemente Object.keys(req)[0]seleziona la prima chiave dell'array di oggetti.


2
Sebbene questo frammento di codice possa risolvere la domanda, inclusa una spiegazione aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro e quelle persone potrebbero non conoscere i motivi del tuo suggerimento sul codice.
DimaSan,

0

La risposta di @thomax è abbastanza buona, ma fallirà se il primo elemento dell'array è false o false-y (0, stringa vuota, ecc.). Meglio restituire true per qualsiasi cosa diversa da undefined:

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

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

-1

ES6 facile:

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

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

1
No ... restituirà il primo valore definito. Se il primo è nullo, indefinito, falso, 0 o una stringa vuota, quella verrà ignorata. Prova:[false, 0, null, undefined, '', 'last'].find(v => v)
Flavien Volken,

Buon punto, la mia soluzione funziona solo per array con valori definiti.
Jan Jarčík,

1
Quindi perché filtrare usando il valore? a.find(value => true)non eliminerà alcun valore. Tuttavia, non consiglio di usare find per ottenere il primo oggetto.
Flavien Volken,

1
@ MiXT4PE che restituisce true (come nella tua risposta) va bene perché si fermerà al primo elemento, qui restituisce l'elemento stesso ... che continuerà se quello è considerato falso
Flavien Volken

1
@ MiXT4PE usando "trova" è più lento, più complicato e meno elegante. Dubito anche che ci sia un editor intelligente in grado di refactoring questa operazione. L'uso della destrutturazione è molto più efficiente, compreso dal linguaggio (in modo da poter eseguire il refactoring), il tipo è compreso dal compilatore (nel caso di TS) e molto probabilmente la soluzione più veloce.
Flavien Volken
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.