Como obter o primeiro número N de elementos de uma matriz


384

Estou trabalhando com o Javascript (ES6) / FaceBook reagindo e tentando obter os 3 primeiros elementos de uma matriz que varia em tamanho. Eu gostaria de fazer o equivalente ao Linq take (n).

No meu arquivo Jsx, tenho o seguinte:

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

Então, para obter os 3 primeiros itens que tentei

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

Isso não funcionou, pois o mapa não possui uma função definida.

Você pode por favor ajudar?


4
Talvez eu esteja entendendo mal o problema, mas por que não usar algo assim list.slice(0, 3);e depois repetir isso?
precisa saber é o seguinte

Por que você quer usar o mapa? Se eu entendi corretamente sua exigência, você pode usar a fatia para obter os primeiros n elementos.
Abhishek Jain

Se o professor disse para usar o mapa? :) Sinto muito se esta é uma pergunta legítima, mas parecia uma lição de casa.
precisa saber é

Por favor, considere mudar a resposta aceita para o que provou mais útil para o público
Brian Webster

Respostas:


401

Acredito que você está procurando:

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

Isso pode ser surpreendente, mas a lengthpropriedade de uma matriz não é usada apenas para obter o número de elementos da matriz, mas também é gravável e pode ser usada para definir o link MDN de comprimento da matriz . Isso mudará a matriz.

Se o array atual não é mais necessário e você não se importa com imutabilidade ou não deseja alocar memória, ou seja, para um jogo, a maneira mais rápida é

arr.length = n

esvaziar uma matriz

arr.length = 0

você tem certeza de que isso é mais rápido que arr = []?
GrayedFox

3
O benefício aqui é evitar a alocação de memória. A inicialização de novos objetos em tempo de execução, ie..e para jogos, está causando o coletor de lixo e o jank.
Pawel

Vale ressaltar que isso mudará a matriz, onde a fatia retornará uma cópia superficial. Isso se torna uma grande diferença se você precisar usar os itens que você acabou de truncar permanentemente.
Ynot

11
@Ynot ok, eu vou fazer isso um pouco mais óbvia
Pawel

4
Isso também expandirá a matriz se for menor que N
Oldrich Svec 02/12/19

13

Não tente fazer isso usando uma função de mapa. A função de mapa deve ser usada para mapear valores de uma coisa para outra. Quando o número de entrada e saída coincide.

Nesse caso, use a função de filtro, que também está disponível na matriz. A função de filtro é usada quando você deseja selecionar seletivamente valores que atendem a determinados critérios. Então você pode escrever seu código como

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

11
Você está correto no geral, mas semanticamente você deve usar o filtro para filtrar primeiro o conjunto de elementos e, em seguida, mapeie o conjunto filtrado se estiver adotando essa abordagem.
Chris

8
A função de filtro passaria por todos os elementos da matriz, enquanto a fatia não, por isso é melhor usar o fatia, certo?
ElQueFaltaba 13/06

11

Você pode filtrar usando a indexmatriz.

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


2
.filterpor si só não é uma ótima opção, pelo menos não se a matriz de entrada puder ser longa. .filterpercorre todos os elementos da matriz, verificando sua condição. .slicenão faria isso, mas apenas extrairia os primeiros n elementos e depois pararia o processamento - o que definitivamente seria o que você deseja para uma longa lista. (Como @elQueFaltaba já disse em comentários à outra resposta.)
MikeBeaton

9

O seguinte funcionou para mim.

array.slice( where_to_start_deleting, array.length )

Aqui está um exemplo

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

4
No primeiro exemplo você usa, slicemas no segundo você usa splice.
Veslav

3
Isso também está errado. Você obterá ["Apple", "Mango"]disso. A primeira parte da fatia não é "por onde começar a excluir"; é por onde começar a fatia. Não modifica a matriz original e não exclui nada.
Angel Joseph Piscola


0

Usar filtro

Não é a melhor prática, mas outra maneira

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.