【问题标题】:Array of objects , group by parent's object对象数组,按父对象分组
【发布时间】:2018-11-23 18:51:05
【问题描述】:

我有一个对象数组。我希望能够对父对象中的对象进行分组,父对象由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 },
    ]},
  ];

【问题讨论】:

  • 您的具体问题在哪里?
  • @NinaScholz 你是什么意思?我希望能够对父对象中的对象进行分组。我无法实现那种分组。
  • 你尝试过什么吗?
  • @NinaScholz 当然,这就是为什么要问,无论如何感谢您的正确答案。
  • “当然,这就是为什么要问” - 那你为什么不发布你的代码?仅仅复制粘贴别人的答案并不能帮助你理解你做错了什么。

标签: javascript arrays sorting ecmascript-6


【解决方案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; }

【讨论】:

    【解决方案2】:

    每次遇到true值时使用reduce添加到累加器,如果遇到false值,则通过属性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);
    }, []);
    

    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 },
      ];
    
    let result = 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);
    }, []);
    
    console.log(result);

    【讨论】:

      【解决方案3】:

      你必须遍历数组,创建一个新数组并评估你需要的条件,如果满足,将它放入新数组中

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

      【讨论】:

      • Object.keys() 用于数组? O.o
      • Object.keys(data).forEach(key => { console.log(data[key].property) })
      • 就像Object.keys 中的Object 已经暗示的那样,这种方法是否适用于对象而不是数组。
      【解决方案4】:

      你正在遍历每个对象的键

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

      找到

      【讨论】:

      • 为什么同一个“答案”两次?
      • 记住它是一个对象数组,因此你可以使用 foreach
      猜你喜欢
      • 2020-02-29
      • 2021-11-19
      • 1970-01-01
      • 2021-01-30
      • 2021-03-29
      • 1970-01-01
      • 1970-01-01
      • 2021-10-14
      相关资源
      最近更新 更多