[英]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.