javascript - Javascript:通过相同的键/值合并/重命名数组中的相似对象
问题描述
使用此示例对象数组:
[{
"Element ID": "299",
"Element Name": "Manager",
"Scale ID": "IM",
"Data Value": "3.5"
},
{
"Element ID": "299",
"Element Name": "Manager",
"Scale ID": "LV",
"Data Value": "3"
},
{
"Element ID": "300",
"Element Name": "FinTech",
"Scale ID": "IM",
"Data Value": "1.75"
},
{
"Element ID": "300",
"Element Name": "FinTech",
"Scale ID": "LV",
"Data Value": "1.38"`
}]
我编写了这段代码来合并重复对象Element ID
并重命名一些元素:
let p = {};
const output = input
.map(s => {
if (_.isEmpty(p)) {
p = s;
return {};
}
if (p['Element ID'] !== s['Element ID']) return {};
const result = {
name: s['Element Name'],
id: s['Element ID'],
importance:
p['Scale ID'] === 'IM'
? p['Data Value']
: s['Scale ID'] === 'IM'
? s['Data Value']
: null,
level:
p['Scale ID'] === 'LV'
? p['Data Value']
: s['Scale ID'] === 'LV'
? s['Data Value']
: null,
};
p = {};
return result;
})
.filter(n => Object.keys(n).length);
所以它现在输出所需的格式:
[{
"name": "Manager",
"id": "299",
"importance": "3.5",
"level": "3"
},
{
"name": "FinTech",
"id": "300",
"importance": "1.75",
"level": "1.38"
}]
这是一种复杂的方法,如果输入对象数组在数组中没有两个彼此相邻的完全相同的对象,则该方法会失败。有没有更好的方法 vialodash
或.reduce()
类似的我不考虑?
解决方案
尝试这个:
const resultObject = originalArray.reduce((result, element) => {
const id = element["Element ID"];
const resultElement = result[id] || {
id,
name: element["Element Name"],
};
switch (element["Scale ID"]) {
case "LV":
resultElement.level = element["Data Value"] || null;
break;
case "IM":
resultElement.importance = element["Data Value"] || null;
break;
}
return {
...result,
[id]: resultElement,
}
}, {});
const resultArray = Object.keys(resultObject).reduce((result, key) => ([
...result,
{
"id": key,
...resultObject[key],
}
]), []);
originalArray
是你的数据。
您可以通过将键移动到常量中来改善这一点。试着让你的代码可读。算法没有那么复杂。避免将库用于此类简单任务。Javascript 已经很强大了。
推荐阅读
- python - 并非所有从 Beautifulsoup find_all 方法返回的 HTML 元素
- firebase - undefined 不是对象(评估'_this2.props')onPress
- node.js - MongoDB 数据比预期更早过期(node js、mongoose)
- python - 对文件夹 python 中的 40k 图像进行排序
- pyspark - 即使不满足插入条件,Delta Lake 插入也会重写数据
- php - Laravel:在jQuery中带有路由的href
- android - 运行 GitHub 操作 android 时出错
- python - 熊猫正则表达式删除连续点之前的数字
- php - 获取产品/服务->WHMCS 到 PHP 的定价数据
- javascript - 在 laravel 中使用 Ajax 更新记录时如何获取旧值?