为什么不从数组中出现的对象中删除属性?

时间:2016-05-06 16:39:51

标签: javascript jquery

我正在尝试从数组中存在的对象中删除属性。实际上在我的对象中,每个对象都包含一个属性shortkeys。我需要删除shortkeys属性,只有当它不存在时才会出现对象。换句话说。

我有一个给定的对象

var obj ={
  alt+c:"alt+c"
  alt+g:"alt+g"
}

我需要从对象中删除shortkey属性,只要它不存在于给定的对象键中。

我试过这个

var arr=[
  {name:"abc",shortkeys:"alt+m"},
  {name:"abc",shortkeys:"alt+a"},
  {name:"abc",shortkeys:"alt+c"},
  {name:"abc",shortkeys:"alt+f"},
  {name:"abc",shortkeys:"alt+g"}
]
var obj ={
  alt+c:"alt+c"
  alt+g:"alt+g"
}

for (var i=0;i<arr.length;i++){
  var o =arr[i];
  for(key in obj){
    if(o.shortkeys !=key){
      delete o.shortkeys;
    }
  }
}

预期输出

var expectedArr=[
  {name:"abc"},
  {name:"abc"},
  {name:"abc",shortkeys:"alt+c"},
  {name:"abc"},
  {name:"abc",shortkeys:"alt+g"}
]

小提琴 https://jsfiddle.net/5134enew/1/

更新

从所有对象中删除 https://jsfiddle.net/5134enew/2/

2 个答案:

答案 0 :(得分:0)

除了语法错误之外,您的代码还会检查是否存在不是快捷键的密钥,而不是检查快捷键是否在您要检查的列表中。针对alt+c检查alt+g,然后将其删除。您希望在发现删除时阻止删除。

所以不要做以下事情......

  for(key in obj){
    if(o.shortkeys !=key){
      delete o.shortkeys;
    }
  }

......你会这样做。

  var match = false;
  for (key in obj) {
    if (o.shortkeys == key) {
      match = true;
      break;
    }
  }
  if (!match) {
    delete o.shortkeys;
  }

正如@Mark Leiber建议的那样,这可以缩短为简单的x in y。您应该意识到在检查所有键后进行删除,而不是在我们遇到不匹配的密钥时删除。

&#13;
&#13;
var arr = [{
  name: "abc",
  shortkeys: "alt+m"
}, {
  name: "abc",
  shortkeys: "alt+a"
}, {
  name: "abc",
  shortkeys: "alt+c"
}, {
  name: "abc",
  shortkeys: "alt+f"
}, {
  name: "abc",
  shortkeys: "alt+g"
}]
var obj = {
  "alt+c": "alt+c",
  "alt+g": "alt+g"
}

for (var i = 0; i < arr.length; i++) {
  var o = arr[i];

  if(!(o.shortkeys in obj)) {
    delete o.shortkeys;
  }
}

console.log(arr);
&#13;
&#13;
&#13;

答案 1 :(得分:0)

如上所述,当代码与obj中的键不匹配时,代码会删除它们。所以(o.shortkeys)&#34; alt + m&#34;!==(键)&#34; alt + c&#34; - &gt;因此删除o.shortkeys.And然后再去检查(已被删除的短键,因此o.shortkeys未定义)即&#34; undefined!= alt + g&#34;没有任何意义,并再次尝试删除o.shorkeys即未定义,这没有任何意义。 我写了一个类似于上面的更详细的代码。 请检查小提琴:jsfiddle.net/som99/d37ws7r6/2/

注释中给出了解释。检查控制台的输出。