获取除第一个和最后一个元素之外的所有数组元素

23

我有一个位置数组,需要能够分别访问起点、中间点和目的地。

我知道我的起点总是第一个元素,目的地总是最后一个元素,但我无法弄清楚如何动态地访问所有中间点?

4个回答

32

由于没有数据可用,我将使用基本数组进行演示。通过这种方法,您将保留原始数组。

var arr = [1,2,3,4,5,6,7];
var middle = arr.slice(1, -1);
console.log(middle);

OR
var arr = [1,2,3,4,5,6,7];
var middle = arr.slice(1, arr.length-1);
console.log(middle);

4
将代码行"var middle = arr.slice(1, arr.length-1);"替换为"var middle = arr.slice(1, -1);"可以让代码更加优化。这样的替换不会改变原有功能,只是将"-1"作为第二个参数传递给slice()方法,使得代码更加简洁高效。 - Prabhakar

24
为了实现这个目标,你可以使用 shift()pop() 方法来分别获取数组的第一个和最后一个元素。在这些操作之后,剩下的元素就是数组的“中间点”。尝试一下:

为了实现这个目标,你可以使用 shift()pop() 方法来分别获取数组的第一个和最后一个元素。在这些操作之后,剩下的元素就是数组的“中间点”。尝试一下:

var middlePoints = ['start', 'A', 'B', 'C', 'end'];
var origin = middlePoints.shift();
var destination = middlePoints.pop();

console.log(origin);
console.log(middlePoints);
console.log(destination);

shift和pop会影响当前数组;有没有一种方法可以获取中间点并改变当前数组?与slice类似,但是slice不会对其产生影响。

当然,你可以使用filter()来实现这个功能,检查项目在数组中的索引:

var input = ['start', 'A', 'B', 'C', 'end'];
var output = input.filter((v, i) => i !== 0 && i !== input.length -1);

console.log(input); // original value retained
console.log(output); // copied via filter


3
shift 和 pop 会影响当前的数组;有没有一种方法可以获取中间点并且改变当前数组呢?就像 slice 一样,但是 slice 不会影响它本身。 - ValRob

2
像这样的东西?

var allPoints = [0, 1, 2, 3, 4, 5],
    midPoints = []

/*start the iteration at index 1 instead of 0 since we want to skip the first point anyway and stop iteration before the final item in the array*/
for (var i = 1; i < (allPoints.length - 1); i++) {
  midPoints.push(allPoints[i]);
}

console.log(midPoints);


尽管这种方法能够生成正确的输出,但我认为它过于繁琐和显式,因为它告诉JS每一个小步骤它必须执行。对于这个任务使用显式循环是我的反模式。不要微观管理。JS内置的midPoints = allPoints.slice(1, allPoints.length-1)可以达到同样的效果,更易读,更清晰地表达你的意图,而且更快。 - Thomas
这个踩票有必要吗?这是一个有效的解决方案回答了OP的问题。你让它听起来像一个基本的for循环会破坏性能。我同意,是的,使用一些内置的js数组函数会更有意义 - 但这是一个非常简单的解决方案,而且它有效。 - Tom O.
这个down-vote反映了我的观点,认为这不是一个好的解决方案,即使它产生了正确的输出。而且这并不是关于性能的问题,而是因为这个代码与使用内置方法相比没有任何优势;甚至不如我经常听到的那个稻草人 "但是我的显式代码更快". 我的观点是,这段代码恰恰是简单的相反。你在微观管理。将项目从一个数组移动到另一个数组,使实际任务变得复杂/模糊:给我allpoints中第一个项目之后开始并在最后一个项目之前结束的部分。 - Thomas

0

一切都变得更加容易了,使用过滤器方法

let Arr = ['first', 'A', 'B', 'C', 'last'];
NewArr = Arr.filter((item,i) => i !== 0 && i !== Arr.length-1);
console.log(NewArr)

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