如何从数组中删除每隔两个和三个元素?

10

我想在Javascript中删除数组中的第二个和第三个元素。

我的数组看起来像这样:

var fruits = ["Banana", "yellow", "23", "Orange", "orange", "12", "Apple", "green", "10"];

现在我想删除每个第二和第三个元素。结果应该如下:

["Banana", "Orange", "Apple"]

我尝试使用for循环和splice:

for (var i = 0; fruits.length; i = i+3) {
    fruits.splice(i+1,0);
    fruits.splice(i+2,0);
};

当然,由于在循环执行时元素被移除了,因此这将返回一个空数组。

我该如何正确地做到这一点?


有几个问题,特别是这相当于运行 while(fruits),它将一直运行,只要水果评估为真,而不仅仅是遍历数组一次。 - Yahel
6个回答

17

你可以从不同的角度来解决这个问题,将不想删除的值使用push()方法推送到另一个数组中:

var firstFruits = []

for (var i = 0; i < fruits.length; i = i+3) {
    firstFruits.push(fruits[i]);
};

这种方法可能不像使用 splice() 那样简洁,但我认为在可读性方面你可以看到它的优点。


我更喜欢第一个,因为第二个会产生一个像 ["Banana","","","Orange","","","Apple"] 的数组。 - Robert
@Robert,你说得完全正确。我相信这不是OP想要的功能。谢谢,我会更新我的回答,只包括第一个。 - McStretch
哇,这很容易。非常感谢。 :-) - Bob

11

您可以使用filter过滤器:

var filtered = [
   "Banana", 
   "yellow", 
   "23", 
   "Orange", 
   "orange", 
   "12", 
   "Apple", 
   "green", 
   "10"
].filter(function(_, i) {
    return i % 3 === 0;
})

返回:

["Banana", "Orange", "Apple"]

我喜欢使用过滤器的方法。但是在这种情况下,(i+1)%3 != 0 && (i+1)%2 != 0 不就等同于 i % 3 === 0 吗?我认为后者更加简单。 - modulitos
在我看来,这是最好的答案。如果你想让它看起来更漂亮,你可以写成.filter((_, i) => i % 3 === 0) - Clemens
@Clemens:没错,但不幸的是它与IE11不兼容。而在大型公司中,IE11却是一个不朽的僵尸。这些公司有足够的资金来进行严肃的开发。真是太遗憾了(引用DT)。 - Jpsy

11

这对我起作用。

var fruits = ["Banana", "yellow", "23", "Orange", "orange", "12", "Apple", "green", "10","Pear","something","else"];

for(var i = 0; i < fruits.length; i++) {
    fruits.splice(i+1,2);
}

//fruits = Banana,Orange,Apple,Pear

这里有一个演示可以更好地说明它:http://jsfiddle.net/RaRR7/


1
尝试以相反的顺序循环遍历数组。

0

你有没有考虑将第一个、第四个和第七个元素复制到一个新数组中?虽然这样不太节省内存,但仍然可以正常工作。


0

你需要从后往前遍历数组,如果 i % 2 == 0 || i%3 == 0,则将该元素从数组中删除。


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