如何从一个数组中获取除第一个元素外的最后五个元素?

318

在 JavaScript 的数组中,如何获取最后 5 个元素,但排除第一个元素

[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 []
9个回答

501

您可以调用:

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

如果不想排除第一个元素,可以使用

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

136

这里有一个我没见过的更短的方法

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

运行下面的代码片段以证明它按照您想要的方式执行

const arr = [];
for (let i = 0; i < 8; i++) {
    arr.push(i);
    console.log(`Array ${i + 1}: ${arr} -> ${arr.slice(1).slice(-5)}`);
}

如果你不介意从浏览器中加载巨大的JavaScript压缩文件,那么另一种做法就是使用lodash https://lodash.com/docs#rest

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

44
如果您正在使用lodash,那么使用takeRight将更加简单。 _.takeRight(arr, 5);

7
它还会处理数组元素少于5个的情况。 - Devank
这会跳过第一个元素吗? - General Grievance

16

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

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

你可以做到这个!


7
这与 y.slice(-5) 相同。 - Dudi
问题不仅仅是关于“slice”的。对于单元素数组,它不应该返回任何东西,而这在当前的答案中没有考虑到。 - General Grievance

14

试试这个:

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
再次强调,这并非关于“担忧”。SO 的主要目的是为特定用户问题提供答案。您原始的回答没有做到这一点。事实上,即使您更新了回答,仍未满足规范要求。 - Jason McCreary
我不同意。它确切地做了他要求的事情:返回最后五个,并且如果第一个包含在最终结果中,则将其向右移动一个。移位是为了确保我们删除第一个(如果包括在内)。即使总数少于五个,它也会返回与SLaks答案完全相同的内容。 - Arka
你的代码有6行,但实际上只需要最多2行(数组和如何获取用户想要的内容)。你的答案不仅没有满足规范,而且过于复杂且错误。 - Belldandu

5

ES6方式:

我使用解构赋值来获取数组的first和剩余的rest元素,然后使用slice方法获取rest的最后五个元素:

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


5
你可以像这样一行完成它:

const y = [1,2,3,4,5,6,7,8,9,10];
const lastX = 5;
const res = y.filter((val, index, arr) => index > arr.length - lastX - 1);
    
console.log(res);

.filter((val, index, arr) => index > arr.length - 6)

0

初学者解决方案:

var givme = function(n) {
    if(n.length == 1) {
        return [];
    }
    if(n.length > 5) {
        return n.slice(n.length-5, n.length);
    }
    if(n.length <= 5) {
       return n.slice(1, n.length);
    }
}

// console.log(givme([1, 55, 77, 88, 99, 22, 33, 44]));

1
一些批评:中间的条件只是 slice(-5)。最后一个条件只是 slice(1)。第一个条件是不必要的。虽然不是严格必要的,但通常最好使用 else if 来显示相关条件。最后,var givme = function(n) 只是 function givme(n) - General Grievance

-2
array.reverse()
     .slice(0,5)
     .reverse()  //if you wanna keep the order of last 5

const myOriginalArray = [...Array(10).keys()] //making an array of numbers

const instanceFromlastFiveItemsOfMyArray = [
    ...myOriginalArray.reverse().slice(0,5).reverse()
    ]

复制粘贴?你在说什么呢? 1. 第一个reverse函数将原始数组反转。 2. slice函数浅复制数组并创建一个新数组。 3. 第二个reverse函数将切片后的数组反转,但不影响原数组。这意味着当完成此操作时,array保持反转状态。如果需要验证,请在线尝试。 - General Grievance
你可能需要阅读文档reverse会改变被调用的数组。如果你一定要使用reverse来解决这个问题,你需要先克隆数组,然后再进行操作。这实际上是两个O(n)操作,而可以像上面的解决方案那样轻松地完成一个O(n)操作。 - General Grievance
哦,它未能满足问题中“不包括第一个元素”的条件。 - General Grievance

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接