【问题标题】:Strip/remove values in array at certain indices在某些索引处删除/删除数组中的值
【发布时间】:2012-09-07 03:49:06
【问题描述】:

我有一个这样的数组:

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 中删除项目?
  • 我需要一份副本,保留原件。
  • 键没有特定的顺序
  • 我相信你的意思是“条纹”(衣服)而不是“条纹”(斑马)
  • @ninjagecko 我已经更新了我的拼写。

标签: javascript arrays loops


【解决方案1】:
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:它将返回people 数组的副本而不修改原始数组
  • +1 表示filter()。注意它似乎在 IE
  • @ninjagecko 我真的可以使用相反的方法,我尝试简单地恢复为return badIndices.indexOf(i) !== -1,但奇怪的是它获得了相同的列表。
  • @Fresheyeball:==!= 永远不会返回不同的列表(除了少数极端情况,几乎可以肯定不是问题);确保您正确打印/记录正确的变量。
【解决方案2】:

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

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

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

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

【讨论】:

  • 我认为这行不通,因为一旦在people[i] 中发生删除,people 数组的索引就会发生变化。
  • 删除数组索引只会留下一个漏洞,因为数组索引只是属性。如果要移位,需要使用splice方法。
  • 我不知道。很有趣。
  • 想一想:你可以使用任何东西作为数组索引。 count['apple'] = 3; 例如。如果你做了delete count['apple'];,那么“转移”剩余的条目意味着什么?
  • 好吧,如果我要使用count['apple'] 之类的东西,我不在数组中,而是在对象中。 javascript 中的对象没有索引。 count['apple']确实是动态的写count.apple,而count[4]不能是count.4
猜你喜欢
  • 2020-10-31
  • 2016-08-15
  • 1970-01-01
  • 2012-10-25
  • 2018-05-17
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2014-05-04
相关资源
最近更新 更多