我有两个对象,一个是这样的数组:
let value = [123,500];
另一个是一个对象数组,如下所示:
let mapObject = [
{id:123,name:"Thing 1"},
{id:444,name:"Thing 2"},
{id:500,name:"Thing 3"},
{id:777,name:"Thing 4"}
];
下一个函数的目标是迭代mapObject,如果id匹配值中的任何元素,则设置一个名为' on'的新属性。为true,否则将其设置为false。这是代码:
for (let i in mapObject) {
for (let j in value) {
if (mapObject[i].id == value[j]) {
mapObject[i].on = true;
} else {
mapObject[i].on = false;
}
}
}
我的期望是:
[
{id:123,name:"Thing 1",on:true},
{id:444,name:"Thing 2",on:false},
{id:500,name:"Thing 3",on:true},
{id:777,name:"Thing 4",on:false}
]
然而我实际上得到了这个:
[
{id:123,name:"Thing 1",on:false},
{id:444,name:"Thing 2",on:false},
{id:500,name:"Thing 3",on:true},
{id:777,name:"Thing 4",on:false}
]
为什么会这样?
答案 0 :(得分:1)
你的循环逻辑不好。一旦将值更新为true,就应该从内循环中断开。
for (let i in mapObject) {
for (let j in value) {
if (mapObject[i].id == value[j]) {
mapObject[i].on = true;
break;
} else {
mapObject[i].on = false;
}
}
}
问题是,一旦您将值更新为true
,您就会使用相同的mapObject[i].id
再次循环,并针对来自value[j]
的新值进行测试。