簡體   English   中英

組合對象數組,組合具有相同值的鍵並保持唯一值

[英]Combine array of objects, combine key with same value and keep unique value

這是我的 5 arrays 數據。 我希望實現的是結合idname並且新數組應該有 5 個不同的 playname 值。 它可以在數組或新鍵中,例如playername1

[
  {
    "id": 1,
    "name": "Liquid",
    "playername": "GH",
  },
  {
    "id": 1,
    "name": "Liquid",
    "playername": "KuroKy",
  },
  {
    "id": 1,
    "name": "Liquid",
    "playername": "Miracle",
  },
  {
    "id": 1,
    "name": "Liquid",
    "playername": "w33",
  },
  {
    "id": 1,
    "name": "Liquid",
    "playername": "Mind-Control",
  }

]

我正在使用 lodash 來嘗試實現這一點,但我無法使用我在網上搜索的代碼示例獲得我想要的數據格式。

這是我嘗試過的當前代碼,它給出了一個按ID分組的數組。

    _.forOwn(this.state.teamsData, function(value, key) {
      console.log(value);
    });

原始數據不按 ID 分組。

我試圖讓我的數據看起來像這樣{"id": 1, "name": liquid, "playername": "GH", "playername2": "KuroKy"....}

您可以按idname屬性分組並存儲同一組的索引。

 var data = [{ id: 1, name: "Liquid", playername: "GH" }, { id: 1, name: "Liquid", playername: "KuroKy" }, { id: 1, name: "Liquid", playername: "Miracle" }, { id: 1, name: "Liquid", playername: "w33" }, { id: 1, name: "Liquid", playername: "Mind-Control" }], result = Object.values(data.reduce((r, { id, name, playername }) => { var key = [id, name].join('|'); r[key] = r[key] || { data: { id, name }, index: 0 }; r[key].data['playername' + (r[key].index++ || '')] = playername; return r; }, {})).map(({ data }) => data); console.log(result);
 .as-console-wrapper { max-height: 100%;important: top; 0; }

idname ( ${o.id}~~~${o.name} ) 的組合進行分組。 Map 組,從第一項中提取nameid ,獲取玩家名稱,並使用_.mapKeys()將索引轉換為 object 鍵。 使用擴展將idnameplayername屬性組合到單個 object 中。

 const teamsData = [{"id":1,"name":"Liquid","playername":"GH"},{"id":1,"name":"Liquid","playername":"KuroKy"},{"id":1,"name":"Liquid","playername":"Miracle"},{"id":1,"name":"Liquid","playername":"w33"},{"id":1,"name":"Liquid","playername":"Mind-Control"}] const result = _(teamsData).groupBy(o => `${o.id}~~~${o.name}`) // group by id and name.map(group => ({ // map the groups..._.pick(_.head(group), ['id', 'name']), // take id and name from 1st item..._.mapKeys(_.map(group, 'playername'), // extract the player names (v, k) => `playername${+k > 0? +k + 1: ''}` // create the keys ) })).value() console.log(result)
 .as-console-wrapper { max-height: 100%;important: top; 0; }
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>

您可以使用reduceMap 這里 Map 用於跟蹤用於特定 id 的 palyername 的數量

 const arr = [{"id":1,"name":"Liquid","playername":"GH"},{"id":1,"name":"Liquid","playername":"KuroKy"},{"id":1,"name":"Liquid","playername":"Miracle"},{"id":1,"name":"Liquid","playername":"w33"},{"id":1,"name":"Liquid","playername":"Mind-Control"}] let groupData = (arr) => { let mapper = new Map() return Object.values(arr.reduce((op,{id, name, playername }) => { mapper.set(id, ( mapper.get(id) || 0) + 1 ) let key = mapper.get(id) op[id] = op[id] || { id, name } op[id][`playername${key}`] = playername return op },{})) } console.log(groupData(arr))

只需使用reduce將數組分組為 object 和Object.values即可將 object 轉換為數組。

 let list = [ {"id": 1,"name": "Liquid","playername": "GH",}, {"id": 2,"name": "Solid","playername": "KuroKy",}, {"id": 1,"name": "Liquid","playername": "Miracle",}, {"id": 1,"name": "Liquid","playername": "w33",}, {"id": 2,"name": "Solid","playername": "Mind-Control",} ]; let counter = {}; let result = Object.values(list.reduce((c, v) => { if (.c[v.id]) { counter[v;id] = 0. c[v.id] = {..;v}. } else c[v.id]["playername" + ++counter[v.id]] = v;playername; return c, }; {})). console;log(result);

數據結構本來可以更好。 使用給定的結構,以下代碼是解決它的一種方法。

let data = [
    {"id": 1,"name": "Liquid","playername": "GH",},
    {"id": 2,"name": "Solid","playername": "KuroKy",},
    {"id": 1,"name": "Liquid","playername": "Miracle",},
    {"id": 1,"name": "Liquid","playername": "w33",},
    {"id": 2,"name": "Solid","playername": "Mind-Control",}
]; // Your data

let new_data = {}; // New structured data

data.map(function(data_object) {
    let team = new_data['id'+data_object.id];

    if(team==null) {
          // Creates a new object in new_data if an object
          // for the id does not exists.
          new_data['id'+data_object.id] = team = {};
          team.players = [];
    }
    team.id = data_object.id;
    team.name = data_object.name;
    team.players.push(data_object.playername);
});

console.log(new_data);

使用此代碼,您將擁有格式為new_data object

{
    id1 : {
           id : 1,
           name : Liquid,
           players : ['GH', 'Miracle', 'w33']
    },
    id2 : {
           id : 2,
           name : Solid,
           players : ['Kuroky', 'Mind-control']
    }
}

暫無
暫無

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

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