Come ottenere il primo numero N di elementi da un array


387

Sto lavorando con Javascript (ES6) / FaceBook e cerco di ottenere i primi 3 elementi di un array di dimensioni variabili. Vorrei fare l'equivalente di Linq take (n).

Nel mio file Jsx ho il seguente:

var items = list.map(i => {
  return (
    <myview item={i} key={i.id} />
  );
});

Quindi per ottenere i primi 3 elementi che ho provato

  var map = new Map(list);
    map.size = 3;
    var items = map(i => {
      return (<SpotlightLandingGlobalInboxItem item={i} key={i.id} />);
    });

Questo non ha funzionato poiché la mappa non ha una funzione impostata.

Potete per favore aiutare?


4
Forse sto fraintendendo il problema, ma perché non usare qualcosa del genere list.slice(0, 3);e poi ripeterlo?
Jesse Kernaghan,

Perché vuoi usare la mappa? Se capisco correttamente il tuo requisito, puoi semplicemente usare slice per prendere i primi n elementi.
Abhishek Jain,

Se l'insegnante ha detto di usare la mappa? :) Mi dispiace se questa è una domanda legittima, ma sembrava solo un compito da fare.
Diynevala,

Ti preghiamo di considerare di cambiare la risposta accettata a quella che si è rivelata più utile al pubblico
Brian Webster,

Risposte:


404

Credo che quello che stai cercando sia:

// ...inside the render() function

var size = 3;
var items = list.slice(0, size).map(i => {
    return <myview item={i} key={i.id} />
}

return (
  <div>
    {items}
  </div>   
)


30

Ciò potrebbe essere sorprendente, ma la lengthproprietà di un array non viene utilizzata solo per ottenere il numero di elementi dell'array, ma è anche scrivibile e può essere utilizzata per impostare il collegamento MDN della lunghezza dell'array . Ciò modificherà l'array.

Se l'array corrente non è più necessario e non ti interessa l'immutabilità o non vuoi allocare memoria, ad esempio per un gioco il modo più veloce è

arr.length = n

per svuotare un array

arr.length = 0

sei sicuro che sia più veloce di arr = []?
GrayedFox

3
Il vantaggio qui è evitare l'allocazione di memoria. L'inizializzazione di nuovi oggetti in fase di esecuzione, ad esempio per i giochi, sta innescando Garbage Collector e Jank.
Pawel,

Vale la pena ricordare che questo cambierà l'array, dove slice restituirà una copia superficiale. Questo diventa una grande differenza se devi usare gli oggetti che hai appena troncato in modo permanente.
Ynot

1
@Non ok, lo renderò un po 'più ovvio
Pawel,

4
Questo espanderà anche l'array se è più piccolo di N
Oldrich Svec il

13

Non provare a farlo utilizzando una funzione della mappa. La funzione Mappa dovrebbe essere usata per mappare i valori da una cosa all'altra. Quando il numero di input e output corrisponde.

In questo caso, utilizzare la funzione filtro disponibile anche sull'array. La funzione filtro viene utilizzata quando si desidera assumere selettivamente valori sulla base di determinati criteri. Quindi puoi scrivere il tuo codice come

var items = list
             .filter((i, index) => (index < 3))
             .map((i, index) => {
                   return (
                     <myview item={i} key={i.id} />
                   );
              });

1
Nel complesso hai ragione, ma semanticamente dovresti usare il filtro per filtrare prima l'insieme di elementi, quindi, mappare l'insieme filtrato se stai adottando questo approccio.
Chris,

8
La funzione filtro passerebbe attraverso tutti gli elementi dell'array, mentre la sezione no, quindi è meglio usare la sezione, giusto?
elQueFaltaba,

11

Puoi filtrare usando l' indexarray.

var months = ['Jan', 'March', 'April', 'June'];
months = months.filter((month,idx) => idx < 2)
console.log(months);


2
.filterda solo non è un'ottima scelta, almeno non se l'array di input potrebbe essere lungo. .filterpassa attraverso ogni elemento dell'array verificandone le condizioni. .slicenon farebbe questo, ma estrarrebbe semplicemente i primi n elementi e poi smetterebbe di elaborare - che sarebbe sicuramente quello che vuoi per un lungo elenco. (Come già detto da @elQueFaltaba nei commenti a un'altra risposta.)
MikeBeaton,

9

Quanto segue ha funzionato per me.

array.slice( where_to_start_deleting, array.length )

Ecco un esempio

var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.slice(2, fruits.length);
//Banana,Orange  ->These first two we get as resultant

4
Nel primo esempio che usi slicema nel secondo che usi splice.
Veslav,

3
Anche questo è sbagliato. Otterrai ["Apple", "Mango"]da questo. La prima parte della sezione non è "da dove iniziare l'eliminazione", è da dove iniziare la sezione. Non modifica l'array originale e non eliminerà nulla.
Angel Joseph Piscola,


0

Usa filtro

Non è la migliore pratica ma un altro modo

const cutArrByN = arr.filter((item, idx) => idx < n);

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.