繁体   English   中英

通过比较 javascript 中的两个对象对对象进行分类

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM