javascript - 使用 for-loop 用不可变 js 构建一个深层对象
问题描述
我正在尝试使用 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
}
}
}
我究竟做错了什么?
解决方案
好的,所以我想我找到了答案。
我不会将其标记为问题的答案,因为我想让其他人有机会发布更好的答案......仅仅因为这有效并不意味着它是正确的;)
我正在创建一个名为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}}}
推荐阅读
- springdoc - SpringDoc Oauth2 需要隐式流随机数参数并且身份验证失败
- python - 在python中将字符串添加到numpy数组中的语法是什么?
- sublimetext3 - 设置构建系统以运行 sublime text 命令
- c - 修改函数内部参数指向的对象是否符合标准?
- spring - 为什么我收到此异常“Bean 名称 'orderModel' 的 BindingResult 和普通目标对象均不可用”;
- css - 制作带有边框和填充的菱形图像
- python - 将函数应用于数据框列
- java - 反编译和编译Jar文件
- python - 如何获得熊猫数据的平均值,包括空白单元格?
- eclipse-rcp - 如何处理 RCP 产品配置的 launcher.ini 文件中的空格