在数组中删除特定索引处的值

4
我有一个数组,如下所示:
peoples = ['dick', 'jane', 'harry', 'debra', 'hank', 'frank' .... ]

还有一个包含如下键的内容:

keys  = [1, 6, 3, 12 .... ]

现在我可以写出像这样的代码:
var peoplesStripedOfKeyPostions = [];

for(i = 0; i < peoples.length; i++){
    for(j = 0; j < keys.length; j++){
        if( i !== keys[j]){
            peoplesStripedOfKeyPostions.push( peoples[i] );
        }
    }        
}

如果你无法分辨,我需要生成一个人员数组,该数组已经去除了由数组键定义的某些位置上的人员。我知道一定有巧妙而有效的方法来做到这一点,但我确实想不出来(数组管理不是我的强项)。
你知道更好的方法吗?(如果我得到多个可行答案,jsperf将决定胜者。)

你需要复制吗,还是可以从“peoples”中删除项目? - Hamish
我需要一份副本,保留原始文件。 - Fresheyeball
密钥没有特定顺序。 - Fresheyeball
我相信你指的是 “脱光衣服” 而不是 “斑马线条纹”。 - ninjagecko
下划线可以使用吗?如果可以的话:_.filter(peoples, function(person, index) {return !_.include(keys, index)}); - Claudio Acciaresi
2个回答

6
people.filter(function(x,i){return badIndices.indexOf(i)==-1})

如果badIndices数组很大,则此方法将变得低效。更有效(尽管不太优雅)的版本如下:

var isBadIndex = {};
badIndices.forEach(function(k){isBadIndex[k]=true});

people.filter(function(x,i){return !isBadIndex[i]})

(注意:您不能使用名为keys的变量,因为那是一个内置函数)

这会改变 peoples 的值还是返回一个我可以复制的值? - Fresheyeball
@Fresheyeball:它将返回people数组的副本,而不修改原始数组。 - ninjagecko
filter() 很好用,但需要注意的是,在 IE < 9 中不支持。 - Jason McCreary
@ninjagecko,实际上我真的需要相反的效果,我尝试简单地恢复到return badIndices.indexOf(i) !== -1,但奇怪的是它得到了同样的列表。 - Fresheyeball
@Fresheyeball:除了极少数例外情况(几乎肯定不是问题),==!=永远不会返回不同的列表;确保您正确打印/记录正确的变量。 - ninjagecko
显示剩余2条评论

1

您可以通过索引直接从数组中删除条目,然后收集剩下的内容。

keys.forEach(function(i) { delete people[i]; });

peopleRemaining = Object.keys(people).map(function(i) { return people[i]; });

请注意,这会修改原始的people数组。

删除数组索引只会留下一个空洞,因为数组索引仅仅是属性。如果您想进行移位,需要使用 splice 方法。 - Raymond Chen
我不知道那个。有趣。 - Fresheyeball
想一想:你可以使用任何东西作为数组索引。例如, count ['apple'] = 3; 如果你执行了 delete count ['apple']; 那么“移动”剩余条目的含义是什么? - Raymond Chen
count['@!#']怎么办?你也不能写成count.@!#JavaScript规范的第15.4节说,数组只是具有特殊length属性的对象,该属性跟踪最高整数值属性。第15.4节还谈到了“稀疏性”,因此很明显可以有空洞。 - Raymond Chen
无论如何,JavaScript支持稀疏数组。您可以从数组中间删除元素,它只会留下一个空洞。这就是为什么上面的代码有效的原因。 - Raymond Chen
显示剩余6条评论

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