javascript - 递归遍历后返回一个新对象
问题描述
我必须操作一个嵌套对象。这是我的代码:
function modify(object) {
Object.keys(object).forEach(key => {
if (typeof object[key] === 'object') {
if (object[key].class && object[key].type && object[key].period) {
object[key].applicableName = `${object[key].class}|${object[key].type}|${object[key].period}`;
delete object[key].class;
delete object[key].type;
delete object[key].period;
} else {
modify(object[key]);
}
}
});
}
这是对象:
[
{
"item": [
{
"period": "period-CYTM",
"type": "type-CMLT",
"class": "class-RFEE",
},
{
"period": "period-FYTD",
"type": "type-CMLT",
"class": "class-RFEE",
},
{
"period": "period-ITD",
"type": "type-ANNL",
"class": "class-RFEE",
},
{
"period": "period-ITD",
"type": "type-CMLT",
"class": "class-RFEE",
},
{
"period": "period-1MTH",
"type": "type-CMLT",
"class": "class-RFEE",
},
{
"period": "period-1YR",
"type": "type-CMLT",
"class": "class-RFEE",
},
{
"period": "period-10YR",
"type": "type-ANNL",
"class": "class-RFEE",
},
{
"period": "period-10YR",
"type": "type-CMLT",
"class": "class-RFEE",
}
]
}
]
它工作正常,但问题是它正在改变原始对象。如何使我的modify
方法返回一个新的修改对象并且原始对象保持不变?
我试图克隆原始对象,然后将克隆的对象传递给该modify
方法,但是,在我看来,这不是一个优雅的解决方案。
解决方案
在您的功能中即时制作副本怎么样?
function modify(object) {
const copy = {};
Object.keys(object).forEach(key => {
if (typeof object[key] === 'object') {
if (object[key].class && object[key].type && object[key].period) {
copy[key].applicableName = `${object[key].class}|${object[key].type}|${object[key].period}`;
} else {
copy[key] = modify(object[key]);
}
} else {
copy[key] = object[key];
}
});
return copy;
}
推荐阅读
- node.js - 如何将 redis 或 firebase 或任何本地数据库用于带有 socket.io 和后端作为 node.js 的聊天应用程序?
- c++ - 如何重载运算符| 专门实现了 C++ 范围适配器?
- r - 是否有在一个图中绘制相关性、分布和散点图的功能?
- mysql - MySQL 8J 驱动程序类是否与 MySQL 5.1.x 连接器系列兼容?
- windows - 共享驱动器上的文件访问权限 - Windows Server
- security - 在 ACLS 中创建 Kafka 时将其设为私有
- c# - Mailkit IMapClient 未命中 ServerCertificateValidationCallback & SslHandshakeException
- mysql - 如何使用 docker compose 在容器中使用一些表初始化数据库?
- sql - 如果子查询返回 null,则从结果集中排除列
- amazon-web-services - S3 存储桶中的跨账户访问问题