【问题标题】:Why is only my last object being updated in loop in object为什么只有我的最后一个对象在对象的循环中更新
【发布时间】:2018-02-18 22:00:18
【问题描述】:

我有两个对象,一个是一个如下所示的数组:

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}
]

为什么会这样?

【问题讨论】:

  • 注意:我只是直接在命令行中尝试了这个,然后得到 Property 'on' does not exist on type... 错误。这可以通过将 on 值全部设置为 false 来初始化对象来解决,但它仍然具有相同的结果。
  • 作为旁注,我建议使用for-of 循环来迭代数组中的值,或者使用forEach 方法。

标签: javascript loops typescript logic


【解决方案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] 的新值进行测试。

【讨论】:

  • 我会将mapObject[i].on = false; 放在for 之前,以确保字段具有值,就好像该值是第一个行进的值,on 将保持未定义
  • 该死,我以为我对打字稿有一些基本的误解。原来我只是个白痴。谢谢。
  • 别担心,伙计,这些事情都会发生。
猜你喜欢
  • 1970-01-01
  • 2011-09-29
  • 2017-09-13
  • 1970-01-01
  • 1970-01-01
  • 2012-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多