比較 2 個物件時分組陣列巢狀值 - JavaScript
假設我們有以下 JSON 物件 -
const input = {
"before": {
"device": [
{
"id": "1234",
"price": "10",
"features": [
{
"name": "samsung",
"price": "10"
},
{
"name": "Apple",
"price": "20"
}
]
},
{
"id": "2154",
"price": "20",
"features": [
{
"name": "samsung",
"price": "30"
},
{
"name": "Moto",
"price": "40"
}
]
}
]
},
"after": {
"device": [
{
"id": "1234",
"price": "50",
"features": [
{
"name": "samsung",
"price": "20"
},
{
"name": "Lenovo",
"price": "30"
}
]
},
{
"id": "2158",
"price": "40",
"features": [
{
"name": "samsung",
"price": "30"
}
]
}
]
}
};我們的要求是,對同一 id 出現在之前和之後的物件,將其 id 和特性組合到一行中。
以下視覺化表示可以更好地描述所需輸出。

我們需要寫一個函式,對資料進行分組和排序,方式與此相同。
示例
以下是程式碼 -
const input = {
"before": {
"device": [
{
"id": "1234",
"price": "10",
"features": [
{
"name": "samsung",
"price": "10"
},
{
"name": "Apple",
"price": "20"
}
]
},
{
"id": "2154",
"price": "20",
"features": [
{
"name": "samsung",
"price": "30"
},
{
"name": "Moto",
"price": "40"
}
]
}
]
},
"after": {
"device": [
{
"id": "1234",
"price": "50",
"features": [
{
"name": "samsung",
"price": "20"
},
{
"name": "Lenovo",
"price": "30"
}
]
},
{
"id": "2158",
"price": "40",
"features": [
{
"name": "samsung",
"price": "30"
}
]
}
]
}
};
const formatJSON = data => {
const sub = Object.fromEntries(Object.keys(data).map(k => [k, 0]));
return Object.values(Object.entries(data).reduce((r, [col, { device }])
=> {
device.forEach(({ id, price, features }) => {
r[id] = r[id] || [{ id, ...sub }];
r[id][0][col] = price;
features.forEach(({ name, price }) => {
let temp = r[id].find(q => q.name === name);
if (!temp){
r[id].push(temp = { name, ...sub });
};
temp[col] = price;
});
});
return r;
}, {}));
};
console.log(formatJSON(input));輸出
這將在控制檯上產生以下輸出 -
[
[
{ id: '1234', before: '10', after: '50' },
{ name: 'samsung', before: '10', after: '20' },
{ name: 'Apple', before: '20', after: 0 },
{ name: 'Lenovo', before: 0, after: '30' }
],
[
{ id: '2154', before: '20', after: 0 },
{ name: 'samsung', before: '30', after: 0 },
{ name: 'Moto', before: '40', after: 0 }
],
[
{ id: '2158', before: 0, after: '40' },
{ name: 'samsung', before: 0, after: '30' }
]
]
廣告
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP