Em uma matriz javascript, como obtenho os últimos 5 elementos, excluindo o primeiro elemento?


197
[1, 55, 77, 88] // ...would return [55, 77, 88]

adicionando exemplos adicionais:

[1, 55, 77, 88, 99, 22, 33, 44] // ...would return [88, 99, 22, 33, 44]

[1] // ...would return []

1
Seu exemplo é os três últimos elementos. Forneça um pouco mais de sua especificação.
Jason McCreary

1
você sempre quer os últimos 5? ou todos, menos o primeiro, não importa o tamanho?
ShaneBlake

3
@ Jason: Ele quer até cinco elementos.
SLaks

@ Jason, sim, eu quero os últimos elementos (até 5) #
TIMEX

3
Como em minha resposta que é provavelmente a maneira mais elegante e mais curto para fazê-loarr.slice(1).slice(-5)
Belldandu

Respostas:


337

Você pode ligar:

arr.slice(Math.max(arr.length - 5, 1))

Se você não deseja excluir o primeiro elemento, use

arr.slice(Math.max(arr.length - 5, 0))

8
+1 simples e útil. Além disso, acho que o último valor (1) deve ser 0 para funcionar. Essa arr.slice (Math.max (arr.length - 5, 0)) funcionou para mim.
Qmaster

@TuteC Não, não, ele retorna o primeiro elemento também.
Jan

3
Ou você poderia ter acabado de fazer uma fatia de cadeia como na minha resposta arr.slice(1).slice(-5)>.>. alguns de vocês também não conseguiram ler o título, pois o OP queria excluir o primeiro resultado da matriz: |
precisa

21
não deveria ser arr.slice(Math.max(arr.length - 5, 0))?
user151496

7
A questão estados "excluindo o primeiro elemento" é por isso que o último valor é 1e não 0.
18116 Don

68

Aqui está um que eu não vi que é ainda mais curto

arr.slice(1).slice(-5)

Execute o snippet de código abaixo para comprovar que está fazendo o que deseja

var arr1 = [0, 1, 2, 3, 4, 5, 6, 7],
  arr2 = [0, 1, 2, 3];

document.body.innerHTML = 'ARRAY 1: ' + arr1.slice(1).slice(-5) + '<br/>ARRAY 2: ' + arr2.slice(1).slice(-5);

Outra maneira de fazer isso seria usar o lodash https://lodash.com/docs#rest - é claro que se você não se importar em carregar um enorme arquivo minificado de javascript, se estiver tentando fazê-lo no seu navegador.

_.slice(_.rest(arr), -5)


29

Se você estiver usando o lodash, é ainda mais simples com o takeRight .

_.takeRight(arr, 5);


2
Ele também cuidar, se a matriz tem menos de 5 elementos
Devank

11

Tente o seguinte:

var array = [1, 55, 77, 88, 76, 59];
var array_last_five;
array_last_five = array.slice(-5);
if (array.length < 6) {
     array_last_five.shift();
}

2
Isso funciona apenas para o exemplo específico do usuário. Isso é matrizes com um comprimento de 4.
Jason McCreary

Não, na verdade não. Funciona bem com qualquer comprimento de matriz. O -3 indica que os três últimos elementos devem ser retornados.
Arka

1
Deixe-me reformular. Nos comentários, nos últimos cinco elementos , você retorna apenas os últimos 3. Qual é o exemplo. Não é a especificação.
precisa

1
-1 O barulho é sobre fornecer a resposta certa . Embora sua resposta funcione para retornar os três últimos elementos, ela não funciona para fornecer os até os últimos 5 elementos, excluindo o primeiro elemento . Qual era a especificação do OP.
Jason McCreary

1
Novamente, não se trata de preocupação . O ponto principal do SO é fornecer respostas para perguntas específicas do usuário. Sua resposta original não. De fato, sua atualização ainda não atende às especificações.
Jason McCreary

9

var y = [1,2,3,4,5,6,7,8,9,10];

console.log(y.slice((y.length - 5), y.length))

você consegue fazer isso!


5
É o mesmo que: y.slice (- 5)
Dudi

1

ES6 maneira:

Eu uso a atribuição de desestruturação da matriz para obter firstos restelementos restantes e, em seguida, utilizarei os últimos cinco do método restwith slice :

const cutOffFirstAndLastFive = (array) => {
  const [first, ...rest] = array;
  return rest.slice(-5);
}

cutOffFirstAndLastFive([1, 55, 77, 88]);

console.log(
  'Tests:',
  JSON.stringify(cutOffFirstAndLastFive([1, 55, 77, 88])),
  JSON.stringify(cutOffFirstAndLastFive([1, 55, 77, 88, 99, 22, 33, 44])),
  JSON.stringify(cutOffFirstAndLastFive([1]))
);

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.