使用带有 for-loop 的不可变 js 构建一个深层对象
build a deep object with immutable js with for-loop
我正在尝试使用 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
}
}
}
我做错了什么?
好的,我想我找到了答案。
我暂时不会将其标记为问题的答案,因为我想让其他人有机会 post 获得更好的答案...只是因为这行得通并不意味着它是正确的;)
我正在创建一个名为 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}}}
我正在尝试使用 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
}
}
}
我做错了什么?
好的,我想我找到了答案。
我暂时不会将其标记为问题的答案,因为我想让其他人有机会 post 获得更好的答案...只是因为这行得通并不意味着它是正确的;)
我正在创建一个名为 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}}}