在一个javascript数组中,如何获取除第一个元素以外的最后5个元素?


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

添加其他示例:

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

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

1
您的示例是最后3个元素。提供更多您的规范。
詹森·麦克雷里

1
您是否总是想要最后5个?还是每个人,但不管长短?
ShaneBlake

3
@杰森:他想要多达五个要素。
Slaks

@Jason,是的,我想要最后一个元素(最多5个)
TIMEX

3
正如我的回答,这可能是最优雅,最短的方法arr.slice(1).slice(-5)
Belldandu

Answers:


337

您可以致电:

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

如果您不想排除第一个元素,请使用

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

8
+1简单实用。另外,我认为最后一个值(1)必须为0才能工作,这arr.slice(Math.max(arr.length-5,0))为我工作。
QMaster 2014年

@TuteC不,不是,它也返回第一个元素。
1

3
或者,您也可以像我的答案arr.slice(1).slice(-5)>。>中那样做一个链条。你们中有些人也没有读到标题,因为OP希望排除数组的第一个结果:|
Belldandu 2015年

21
不是arr.slice(Math.max(arr.length - 5, 0))吗?
user151496 '16

7
问题指出“不包括第一个元素”,这就是为什么最后一个值不是,1而不是0
Don Cruickshank

68

这是我还没见过的那个

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

运行下面的代码片段以证明它可以满足您的要求

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

另一种方法是使用lodash https://lodash.com/docs#rest-这当然是如果您不介意尝试从浏览器中加载大型JavaScript缩小文件的情况。

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



11

试试这个:

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
这仅适用于用户的特定示例。这是一个4的长度的阵列
詹森麦克里

不,不是。在任何长度的数组上都能正常工作。-3表示应返回最后3个元素。
阿卡

1
让我改一下。在注释中,最后五个元素仅返回最后3个。这是示例。不是规格。
詹森·麦克雷里

1
-1大惊小怪的是要提供正确的答案。虽然您的答案可以返回最后3个元素,但不能提供最多5个元素(不包括第一个元素)。这是OP的规格。
詹森·麦克雷里

1
同样,这与担心无关。SO的重点是提供针对特定用户问题的答案。您原来的答案没有。实际上,您的更新仍不符合规范。
詹森·麦克雷里


1

ES6方式:

我使用数组的解构分配来获取first和保留rest元素,然后使用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]))
);

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.