javascript - 重构 map、reduce 和 double for 循环 - javascript es6
问题描述
我有一个 JavaScript 对象,可以说parentObj
。
如何改进以下代码。我有一个
reduce
,一个map
和一个double for loop
。
[
{
NAME: 'SOMENAME',
ID: '1',
FROM: '20191223',
TO: '99991231'
},
{
NAME: 'SOMENAME',
ID: '2',
FROM: '20191223',
TO: '99991231'
},
{
NAME: 'SOMENAME',
ID: '3',
FROM: '20191223',
TO: '99991231'
}
]
我创建了一个新对象。
const newObj = .reduce(
function (obj, item) {
obj[item.NAME] = obj[item.NAME] || [];
obj[item.NAME].push(item.ID);
return obj;
},
{}
);
然后从中取出一个新的对象数组。
const newObjArr = Object.keys(newObj ).map(function (key) {
return { NAME: key, ID: newObj [key] };
});
然后是一个双 for 循环。
for (let item1 of newObjArr) {
for (let item2 of parentObj) {
if (item1.NAME=== item2.NAME) {
finalObjArr.push({ NAME: item1.NAME, ID: item1.ID, FROM: item2.FROM, TO: item2.TO});
}
}
}
我的最终输出:
[
{
NAME: 'SOMENAME',
ID: [1, 2, 3],
FROM: '20191223',
TO: '99991231'
},
...
]
解决方案
您已经拥有newObj
可以按名称查找内容的地方。无需构建它newObjArr
并循环它以按名称搜索。写吧
for (const item2 of parentObj) {
const item1_NAME = item2.NAME;
const item1_IDs = newObj[item1_NAME];
finalObjArr.push({ NAME: item1_NAME, ID: item1_IDs, FROM: item2.FROM, TO: item2.TO});
}
鉴于您在评论中的更新,我建议您实际上将您的对象与所有信息放在 中newObj
,那么您需要获取的只是它作为数组的值:
const newObj = parentObj.reduce((obj, item) => {
if (!(item.NAME in obj))
obj[item.NAME] = { NAME: item.NAME, ID: [], FROM: item.FROM, TO: item.TO };
obj[item.NAME].ID.push(item.ID);
return obj;
}, {});
const finalObjArr = Object.values(newObj);
推荐阅读
- android - 错误:在 android studio 上更改类路径后无法解决问题
- excel - 创建一个存储库;用户从输入框输入数据,数据保存在另一张表中
- cakebuild - 如何使用#define 加载任务?
- python - Numpy减去两个ndim相等但形状不同的数组
- ios - #if canImport() 无法与 CocoaPods 一起正常工作。严重的问题
- linux - 为什么它一直向我显示exists() 错误?
- validation - 如何在 [framework7] 中验证 SmartSelect、Radio 和 Checkboxes
- flask-sqlalchemy - Marshmallow - 按声明的顺序对字段值进行排序
- microsoft-teams - Microsoft Flow/Teams 自适应卡
- javascript - 使用动态变量获取状态值 React Native