将数组转换为哈希图。如何写得更好

时间:2019-07-04 04:40:58

标签: javascript

什么是最好的转换代码

[
   {id : 1, payload : "aaa"},
   {id : 1, payload : "bbb"},
   {id : 2, payload : "ccc"}
]

{  
    "1" : [
        {id : 1, payload : "aaa"},
        {id : 1, payload : "bbb"}
    ],
    "2" : [
        {id : 2, payload : "ccc"}
    ]
]

变量

let res = {}
src.forEach(r=>{
    let id = r.id;
    let arr = res[id];
    if (!arr) {
        res[id] = [];
        arr = res[id];
    }
    arr.push(r);
});

简而言之

src.forEach(r=>(res[r.id] || (res[r.id] = [])).push(r));

如何删除一个res[r.id]

我想要类似的东西

src.forEach(r=>(res[r.id] ?= []).push(r));

inb4:写入功能

是的,我可以,但是看起来不那么美观,不仅仅对这种情况有疑问。

2 个答案:

答案 0 :(得分:0)

您可以使用Array.reduce来实现。

const input = [
   {id : 1, payload : "aaa"},
   {id : 1, payload : "bbb"},
   {id : 2, payload : "ccc"}
];

const output = input.reduce((acc, curr) => {
  if (acc[curr.id]) {
    acc[curr.id].push(curr);
  } else {
    acc[curr.id] = [curr]
  }
  return acc;
}, {});

console.log(output);

答案 1 :(得分:0)

您可以使用一个Map并为每个相同的id获得一个相同的组。最后,构建一个新对象。

var data = [{ id: 1, payload: "aaa" }, { id: 1, payload: "bbb" }, { id: 2, payload: "ccc" }],
    result = Object.fromEntries([
        ...data.reduce((m, o) => m.set(o.id, [...(m.get(o.id) || []), o]), new Map)
    ]);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }