对象数组,按父对象分组

时间:2018-11-23 18:51:06

标签: javascript arrays sorting ecmascript-6

我有一系列对象。我希望能够将对象归为父对象的对象,父对象由broker: true确定。有没有办法将其转换:

const data = [
    { id: 1, broker: true },
    { id: 2, broker: false },
    { id: 3, broker: false },
    { id: 4, broker: true },
    { id: 5, broker: false },
    { id: 6, broker: true },
    { id: 7, broker: false },
    { id: 8, broker: false },
    { id: 9, broker: false },
  ];

变成这样:

const data = [
    { id: 1, broker: true, chunks: [
      { id: 2, broker: false },
      { id: 3, broker: false },
    ]},
    { id: 4, broker: true, chunks: [
      { id: 5, broker: false },
    ]},
    { id: 6, broker: true, chunks: [
      { id: 7, broker: false },
      { id: 8, broker: false },
      { id: 9, broker: false },
    ]},
  ];

4 个答案:

答案 0 :(得分:1)

您可以检查broker的属性,然后将一个新对象推送到结果集中,或者将该对象推送到先前对象的块数组。

const
    data = [{ id: 1, broker: true }, { id: 2, broker: false }, { id: 3, broker: false }, { id: 4, broker: true }, { id: 5, broker: false }, { id: 6, broker: true }, { id: 7, broker: false }, { id: 8, broker: false }, { id: 9, broker: false }],
    grouped = data.reduce((r, o) => {
        if (o.broker) {
            r.push(Object.assign({}, o, { chunks: [] }));
        } else {
            r[r.length - 1].chunks.push(o);
        }
        return r;
    }, []);

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

答案 1 :(得分:0)

每次使用reduce到累加器时,将其添加到true值中;如果运行到false值中,则通过属性{{ 1}}

chunks

data.reduce((a, cv) => {
 let len = a.length - 1;
 return  (cv["broker"]) ? (a.push(cv), a) : (a[len] 
 ["chunks"] || (a[len]["chunks"] = []), a[len] 
 ["chunks"].push(cv), a);
}, []);

答案 2 :(得分:-1)

您必须遍历数组,创建一个新数组并评估所需条件,如果满足,则将其放入新数组中

Object.keys(data).forEach((value, index) => {

  // code

})

答案 3 :(得分:-1)

您正在浏览每个对象的键

Object.keys(data).forEach(key => {
  console.log(data[index].property)
})

找到