从Javascript数组中删除旧值

4

我有一个像下面这样的 JavaScript 数组,

 var stack=array();
 stack[0]=1;
 stack[1]=10;
 stack[5]=5;
 ------------
 ------------
 stack[50]=15;
 stack[55]=5; etc

我只需要从数组中获取最后n个元素,也就是说如果n=2, 我的结果会像这样:

 stack[0]=15;
 stack[1]=5;

如何使用JavaScript从数组中取消旧值,同时保留所需元素?
4个回答

3

编辑:根据楼主后续的评论,看起来您想要下面我列出的最后两个选项(我为教育目的而将其他选项保留在此处)。

要获取最后N个元素(我们在这些示例中使用2个),您可以选择以下选项,具体取决于您想从原始数组中删除所有其他内容、仅删除原始数组的最后N个元素还是从原始数组中复制最后N个元素。同时,这也取决于您的数组是否稀疏(您的示例似乎有点像)。

基本上,您可以使用数组操作.splice().slice().splice()会更改原始数组。.slice()会从原始数组中复制元素。

.splice().slice() 的参考信息。

以下是一些选项(具体取决于您想要做什么):

// remove all elements except the last 2 from the array
stack.splice(0, stack.length -2);

或者

// return a new array of just the last two elements
// removes them from the original array too
var lastElements = stack.splice(-2, 2);

或者

// return a copy of just the first two items in the array (
// leaves original array unchanged
var lastElements = stack.slice(-2);

或者

如果你的数组是稀疏的,想要收集实际存在的最后N个元素,那么可以遍历它,收集存在的元素:

var collection = [];
for (i = stack.length - 1; i >= 0; i--) {
    if (stack[i] !== undefined) {
        collection.unshift(stack[i]);
        if (collection.length == 2) {
            break;
        }
    }
}

或者

如果您不需要支持IE8或者会安装一个Array.prototype.filter的polyfill,并且只想要最后两个元素的副本,那么您可以将上一个选项简化为:

stack = stack.filter(function(item) {return item !== undefined}).slice(-2);

所有方法的演示:http://jsfiddle.net/jfriend00/f7LrA/


1
@meagar - 合理的点踩者请解释一下为什么要点踩。我的回答哪里错了? - jfriend00
@meagar - 你给我的答案点踩是因为你认为它比你的不够优雅吗?天啊 - 这不是点踩的目的。由于OP留下了许多细节不清楚,所以我试图教育他们可以使用的可能性。如果您有兴趣帮助StackOverflow上出现最佳内容,并且您看到一个您认为错误的答案,您可以解释一下原因。这有助于每个人,包括OP、编写答案的人和读者。仅仅点击一堆踩并不能像帮助社区那样有效。 - jfriend00
@meagar - 如果您能解释为什么认为它应该被点踩,那么这些点踩对每个人都更有价值。 - jfriend00
除了你的回答和一个完全没有用处的仅包含链接的回答外,每个回答都有作者明确说明为什么该回答是错误的评论。 - user229044
@meagar - 在.filter()中,仍然不支持IE 8,而有些人想要支持它。在我的答案中,我不会盲目地假设每个人都已经放弃了IE 8或知道填充方法。 - jfriend00
显示剩余7条评论

2
您需要使用 Array.slice() 在这个上下文中达到您想要的效果。

尝试一下,

stack = stack.slice(stack.length - n , stack.length)

演示


但是索引不是按顺序排列的,http://jsfiddle.net/shijin/MtJZ3/,我得到了未定义的结果。 - Shijin TR
@shin 是的,那很明显。你没有给数组的那个单元格填充任何值。如果你想要达到预期的效果,可以反向遍历数组。 - Rajaprabhu Aravindasamy
能否按顺序排列索引? - Shijin TR

1
你认为你的数组没有使用连续的键,但实际上它确实这样做。你没有明确赋值的索引处的值只是undefined
你需要从数组中删除undefined元素,然后对结果进行切片:
var stack = [];
var n=2;

stack[0]=1;
stack[1]=10;
stack[2]=5;
stack[7]=15;
stack[9]=5; 

// Here, stack == [1, 10, 5, undefined × 4, 15, undefined × 1, 5]

// map stack to a new array, omitting "falsy" values
stack = stack.filter(function (v) { return v; });

// Now stack == [1, 10, 5, 15, 5]

stack = stack.slice(stack.length - n , stack.length)

console.log(stack[0]); // 15
console.log(stack[1]); // 5

这将省略任何假值;如果您只想删除undefined元素...
stack = stack.filter(function (v) { return v !== undefined; });

0

你可以使用 splice 来改变数组

stack.splice(2, stack.length - 2);

你可以使用 slice 来获取新的数组

var newStack = stack.slice(0, 2);

我尝试了使用slice http://jsfiddle.net/shijin/YQpD2/,但结果并不如预期。 - Shijin TR
@FizerKhan - 这是不公平的,我已经纠正了-1-。 - Ed Heal

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