[英]Categorisation of objects by comparing two objects in javascript
我試圖通過比較兩個對象來對對象進行分類,比如數據和類別
const data = {
"1a": {
"name": "1a",
"count": 154
},
"1b": {
"name": "1b",
"count": 765
},
"1c": {
"name": "1c",
"count": 7877
},
"777": {
"name": "777",
"count": 456
}
};
const categories = {
"A_category":["A","1a", "2a"],
"B_category":["1b", "2b"],
"C_category":["1c", "2c"],
"D_category":["1d", "2d"]
};
我想根據類別 object 對數據進行分組,當沒有匹配時,組應該是其他組,結果數據應該是
const resultData = [
{ group: 'Others', name: '777', count: 456 },
{ group: 'A_category', name: '1a', count: 154 },
{ group: 'B_category', name: '1b', count: 765 },
{ group: 'C_category', name: '1c', count: 7877 }
]
我使用了 function 但無法達到結果
const resultData = [];
function restructure(data, categories) {
Object.keys(data).map(
dataKey => {
for (let [key, value] of Object.entries(categories)) {
value.includes(dataKey) ? resultData.push({"group": key,...data[dataKey]}) : resultData.push({"group": "Others",...data[dataKey]}) ;
break;
}
}
)
}
restructure(data,categories);
你也可以試試這個。 遍歷您的data
條目並查找密鑰是否存在於任何categories
object 數據中,並將其推送到以找到的category
為組的數組中,或者將其與Others
作為組一起推送,如下面的代碼所示
const data = { "1a": { "name": "1a", "count": 154 }, "1b": { "name": "1b", "count": 765 }, "1c": { "name": "1c", "count": 7877 }, "777": { "name": "777", "count": 456 } }; const categories = { "A_category": ["A", "1a", "2a"], "B_category": ["1b", "2b"], "C_category": ["1c", "2c"], "D_category": ["1d", "2d"] }; const resultData = []; Object.entries(data).map(([key, val])=>{ let group = Object.keys(categories).find(category=>categories[category].includes(key)) || 'Others' resultData.push({ group, ...val }) }) console.log(resultData)
而不是for
循環,您需要使用filter
作為let category = Object.entries(categories).filter(([key, value]) => value.includes(dataKey));
.
如果category.length > 0
則類別可用,否則使用Others
。
在下面試試。
const data = { "1a": { "name": "1a", "count": 154 }, "1b": { "name": "1b", "count": 765 }, "1c": { "name": "1c", "count": 7877 }, "777": { "name": "777", "count": 456 } }; const categories = { "A_category": ["A", "1a", "2a"], "B_category": ["1b", "2b"], "C_category": ["1c", "2c"], "D_category": ["1d", "2d"] }; const resultData = []; function restructure(data, categories) { Object.keys(data).map( dataKey => { let category = Object.entries(categories).filter(([key, value]) => value.includes(dataKey)); resultData.push({ "group": category.length > 0? category[0][0]: "Others", ...data[dataKey] }); }) } restructure(data, categories); console.log(resultData);
那是因為無論您是否找到該類別,您都在跳出循環。 您for
循環只會執行一次然后立即中斷。 如果第一個類別 object 匹配,則使用它,如果不匹配,則分配"Others"
並且循環退出而不檢查類別的 rest。 只有在查找成功時才跳出循環:
for (let [key, value] of Object.entries(categories)) {
if(value.includes(dataKey)) { // if this is the category
resultData.push({ "group": key, ...data[dataKey] }); // use it ...
return; // ... and break the loop and the current iteration of forEach. The current object is handled
}
}
resultData.push({ "group": "Others", ...data[dataKey] }); // if the return statement above is never reached, that means the category was not found, assign "Others"
順便說一句,您可以使用其他數組方法來縮短內容,如下所示:
function restructure(data, categories) {
return Object.keys(data).map(key => ({
"group": Object.keys(categories).find(cat => categories[cat].includes(key)) || "Others",
...data[key]
}));
}
然后像這樣使用:
const resultData = restructure(data, categories);
我的方法使用find
嘗試查找包含 object 名稱的類別鍵,如果find
失敗,則返回null
,此時|| "Others"
|| "Others"
部分被評估, "Others"
將用作組名( JavaScript 是否有“短路”評估? )。
演示:
const data = {"777":{"name":"777","count":456},"1a":{"name":"1a","count":154},"1b":{"name":"1b","count":765},"1c":{"name":"1c","count":7877}}; const categories = {"A_category":["A","1a","2a"],"B_category":["1b","2b"],"C_category":["1c","2c"],"D_category":["1d","2d"]}; function restructure(data, categories) { return Object.keys(data).map(key => ({ "group": Object.keys(categories).find(cat => categories[cat].includes(key)) || "Others", ...data[key] })); } const resultData = restructure(data, categories); console.log(resultData);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.