javascript - 在 JavaScript 中使用递归更新嵌套的 json 对象
问题描述
我正在尝试从现有对象创建更新的对象。示例对象是:
// sample object
const testObj = {
a: 1,
b: {
c: 2,
d: {
e: 3,
f: {
g: 4
}
}
}
};
我想从上面的对象创建一个新对象,每个值都有一些串联:
// expected object
const expectedObject= {
a: '1 a',
b: {
c: '2 a',
d: {
e: '3 a',
f: {
g: '4 a'
}
}
}
};
这是我的示例代码:
let expectedObject = {};
const newObject = object => {
Object.entries(object).forEach(([key, value]) => {
if (typeof value === "object") {
Object.keys(value).map(key => {
value[key] = value[key] + " a";
return value;
});
expectedObject[key] = value;
//return newTest;
} else {
expectedObject[key] = value;
return expectedObject;
}
});
return expectedObject;
};
console.log(newObject(testObj));
控制台中的结果是:
{a: 1, b: {…}}
a: 1
b:
c: "2 a"
d: "[object Object] a"
__proto__: Object
__proto__: Object
我想在这里使用递归并且也尝试过但没有运气。任何帮助,谢谢?
解决方案
您可以获得一个新对象,我的映射更改了值并创建了新对象。
function map(object, fn) {
return Object.fromEntries(Object
.entries(object)
.map(([k, v]) => [k, v && typeof v === 'object' ? map(v, fn) : fn(v)])
);
}
var object = { a: 1, b: { c: 2, d: { e: 3, f: { g: 4 } } } },
result = map(object, v => v + ' a');
console.log(result);
如果内部有数组,则可以提前添加检查并映射值。
const
map = fn => {
const iter = v => v && typeof v === 'object'
? Array.isArray(v)
? v.map(iter)
: Object.fromEntries(Object.entries(v).map(([k, v]) => [k, iter(v, fn)]))
: fn(v);
return iter;
};
var object = { a: 1, b: { c: 2, d: { e: 3, f: { g: 4, k: [5, 6] } } } },
addA = map(v => v + ' a'),
result = addA(object);
console.log(result);
推荐阅读
- javascript - 如何获取字典中具有相同值的不同键?
- python - Python time.ctime() 格式:0-padding 或 space-padding
- c# - 如何调用具有 MouseEventArgs 的方法?
- azure - 如何在 queueCollector.AddAsync 中设置 VisibilityTimeout?
- javascript - 带有 React Redux 的汉堡菜单不起作用
- shopify - 登录后创建 Shopify 结帐重定向 URL
- c++ - 如何在 QTableView Qt C++ 中将 sqlite db 数据显示为多列视图?
- laravel - Laravel 基于从属模型获取计数
- selenium-webdriver - 使用 selenium webdriver 中的 aShot 类捕获多个屏幕截图(不覆盖前一个)
- mysql - 从一个表中选择数据库并将特定值插入返回的数据库中