用for循环用不可变的js构建一个深层对象

问题描述 投票:1回答:1

我正在尝试使用immutable-js构建一个对象来构建较小的对象,然后将它们合并到更大的对象中。

这是我尝试过的:

let globalObject = Immutable.Map({});
let keys = ["a","b","c"];
let newKeys = ["x","y","z"];
const objThing = { "q": 77 };
let newGlobalObject = globalObject.setIn(keys, objThing);

for (let i = 0; i < 3; i++) {
  const original = newGlobalObject.getIn(['a', 'b']);
  const newKey = newKeys[i];
  const newObject = {};
  newObject[newKey] = i;
  const mergedObject = original.merge(newObject);
  globalObject = newGlobalObject.updateIn(['a', 'b'], val => {
    return mergedObject
  });
}

console.log(JSON.stringify(globalObject));

但是,输出是

{
  "a": {
    "b": {
      "c": {
        "q": 77
      },
      "z": 2
    }
  }
}

而我希望它是:

{
  "a": {
    "b": {
      "c": {
        "q": 77
      },
      "x": 0,
      "y": 1,
      "z": 2
    }
  }
}

我究竟做错了什么?

javascript immutable.js
1个回答
0
投票

好的,所以我觉得我找到了答案。

我不会将它标记为问题的答案,因为我想给别人一个机会发表一个更好的答案......只是因为这个作品并不意味着它是正确的;)

我正在创建一个名为newGlobalObject的新变量来存储数据,因为我认为使用globalObject是错误的,因为这会改变事物。但事实证明,这正是我必须要做的。

let globalObject = Immutable.Map({});
let keys = ["a", "b", "c"];
let newKeys = ["x", "y", "z"];
const objThing = {
  "q": 77
};
globalObject = globalObject.setIn(keys, objThing);

for (let i = 0; i < 3; i++) {
  const original = globalObject.getIn(['a', 'b']);
  const newKey = newKeys[i];
  const newObject = {};
  newObject[newKey] = i;
  const mergedObject = original.merge(newObject);
  globalObject = globalObject.updateIn(['a', 'b'], val => {
    return mergedObject
  });
}

console.log(globalObject.toJs());

输出:{"a":{"b":{"c":{"q":77},"x":0,"y":1,"z":2}}}

© www.soinside.com 2019 - 2024. All rights reserved.