簡體   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