我正在尝试从数组中存在的对象中删除属性。实际上在我的对象中,每个对象都包含一个属性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/
答案 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
。您应该意识到在检查所有键后进行删除,而不是在我们遇到不匹配的密钥时删除。
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;
答案 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/
注释中给出了解释。检查控制台的输出。