簡體   English   中英

分組 Javascript object 基於數組 Object 列表

[英]Group Javascript object based on Array Object list

我正在嘗試找到一種方法來根據組array轉換此對象列表。 我發現棘手的部分是遍歷組數組並將 object 應用於多個位置(如果有多個組)。

我還試圖忽略任何不屬於任何事物的群體。 我試過使用reduce function 但我無法通過組數組進行迭代。

  let cars = 
    [
      {
        "group":[],
        "name": "All Makes",
        "code": ""
      },
      {
        "group":["Group A"],
        "name": "BMW",
        "code": "X821"
      },
      {
        "group":["Group B"],
        "name": "Audi",
        "code": "B216"
      },
      {
        "group":["Group B"],
        "name": "Ford",
        "code": "P385"    
      },
      {
        "group":["Group B", "Group C"],
        "name": "Mercedes",
        "code": "H801"
      },
      {
        "group":["Group C"],
        "name": "Honda",
        "code": "C213"
      }
    ]

變成這樣:

let cars = {
    "Group A": [
      {
        name: "BMW",
        code: "X821",
      }
    ],
    "Group B": [
      {
        name: "Audi", 
        code: "B216"
      },
      {
        name: "Ford", 
        code: "P385"
      },
      {
        name: "Mercedes",
        code: "H801"
      }
    ],
    "Group C":[
      {
        name: "Mercedes",
        code: "H801"
      },
      {
        name:"Honda", 
        code: "C213"
      }
    ]
  };

我已經嘗試使用 reduce 來完成此操作,但如果它在多個組中,則分組不會復制。

let result = cars.reduce(function(x, {group, name}){
  return Object.assign(x, {[group]:(x[group] || [] ).concat({group, name})})
}, {});

任何有助於解決此問題的指示將不勝感激。

您可以使用.reduce()遍歷 cars 中的每輛cars object。 對於給定汽車的每個group數組,您可以使用.forEach()然后將該組作為鍵添加到累加器。 如果累加器中已經設置了分組,則可以抓取分組的對象數組,否則,可以創建一個新數組[] 一旦你有了一個數組,你就可以使用.concat()將 object 添加到數組中。 由於我們在group數組上使用.forEach() ,如果它為空,它不會將 object 添加到累積的 object 中,因為.forEach()不會迭代空數組。

請參見下面的示例:

 const cars = [{ "group":[], "name": "All Makes", "code": "" }, { "group":["Group A"], "name": "BMW", "code": "X821" }, { "group":["Group B"], "name": "Audi", "code": "B216" }, { "group":["Group B"], "name": "Ford", "code": "P385" }, { "group":["Group B", "Group C"], "name": "Mercedes", "code": "H801" }, { "group":["Group C"], "name": "Honda", "code": "C213" } ]; const res = cars.reduce((acc, {group, ...r}) => { group.forEach(key => { acc[key] = (acc[key] || []).concat({...r}); // copy r so it is a different reference for each grouped array }); return acc; }, {}); console.log(res);

一些基本的方法。 @Nick 的好多了。

 let cars = [{ "group": [], "name": "All Makes", "code": "" }, { "group": ["Group A"], "name": "BMW", "code": "X821" }, { "group": ["Group B"], "name": "Audi", "code": "B216" }, { "group": ["Group B"], "name": "Ford", "code": "P385" }, { "group": ["Group B", "Group C"], "name": "Mercedes", "code": "H801" }, { "group": ["Group C"], "name": "Honda", "code": "C213" } ] let newCars = {}; cars.forEach(o => { o.group.forEach(g => { if (;newCars[g]) newCars[g] = []. newCars[g]:push({ name. o,name: code. o;code }); }); }). console;log(newCars);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM