【问题标题】:group object as 2d array by key按键将对象分组为二维数组
【发布时间】:2018-10-08 21:50:07
【问题描述】:

我有一个对象数组。这些对象有一个名为time 的属性。如果它们的时间相同,我想将这些对象分组到同一个数组中。

{ "00:00" :
   [{"id":1, time: "00:05",
    {"id":1, time: "00:15",
    {"id":1, time: "00:20",
    {"id":2, time: "00:05",
    {"id":3, time: "00:05",
    {"id":4, time: "00:35 }]
}

我想把上面的数据格式化为:

{ "00:00" :[
    [{"id":1, time: "00:05"}, {"id":2, time: "00:05"}, {"id":3, time: "00:05"}],
    [{"id":1, time: "00:15" }],
    [{"id":1, time: "00:20" }],      
    [{"id":4, time: "00:35" }]]
}

关于如何实现这一点的任何建议?

【问题讨论】:

  • "00:00" 这样的属性有很多还是只有一个?
  • 可以有 "01:00" , "02:00" ...等

标签: javascript arrays node.js


【解决方案1】:

使用.reduce将所有匹配的对象放入一个按时间索引的对象内的数组中,然后从对象中提取值:

const input = { "00:00" :
   [{"id":1, time: "00:05"},
    {"id":1, time: "00:15"},
    {"id":1, time: "00:20"},
    {"id":2, time: "00:05"},
    {"id":3, time: "00:05"},
    {"id":4, time: "00:35" }]
};
const outputObj = input['00:00'].reduce((accum, { id, time }) => {
  if (!accum[time]) accum[time] = [];
  accum[time].push({ id, time });
  return accum;
}, {});
const outputArr = Object.values(outputObj);
console.log(outputArr);

您还可以将其扩展为应用于input 数组的多个属性:

const input = { "00:00" :
   [{"id":1, time: "00:05"},
    {"id":1, time: "00:15"},
    {"id":1, time: "00:20"},
    {"id":2, time: "00:05"},
    {"id":3, time: "00:05"},
    {"id":4, time: "00:35" }],
    "01:00" :
   [{"id":1, time: "01:05"},
    {"id":1, time: "01:15"},
    {"id":1, time: "01:20"},
    {"id":2, time: "01:05"},
    {"id":3, time: "01:05"},
    {"id":4, time: "01:35" }],
};
function transformInputArrToGroupedArr(inputArr) {
  const outputObj = inputArr.reduce((accum, { id, time }) => {
    if (!accum[time]) accum[time] = [];
    accum[time].push({ id, time });
    return accum;
  }, {});
  return Object.values(outputObj);
}
const transformedInput = Object.entries(input).reduce((accum, [ key, arr ]) => {
  accum[key] = transformInputArrToGroupedArr(arr);
  return accum;
}, {});
console.log(transformedInput);

【讨论】:

    【解决方案2】:

    您可以尝试使用 Array 的 reduce(),如下所示:

    var obj = { "00:00" :
       [{"id":1, time: "00:05"},
        {"id":1, time: "00:15"},
        {"id":1, time: "00:20"},
        {"id":2, time: "00:05"},
        {"id":3, time: "00:05"},
        {"id":4, time: "00:35" }]
    }
    
    var res = obj['00:00'].reduce(function(a, c){
      a[c.time] = a[c.time] || [];
      a[c.time].push(c);
      return a;
    }, {});
    
    console.log(res);
    .as-console-wrapper { top: 0; }

    【讨论】:

      【解决方案3】:

      您可以使用reduce 来汇总您的对象并使用Object.values 将对象转换为数组

      let obj={"00:00" :[{"id":1,time:"00:05"},{"id":1,time:"00:15"},{"id":1,time:"00:20"},{"id":2,time:"00:05"},{"id":3,time:"00:05"},{"id":4,time:"00:35"}],"02:00" :[{"id":1,time:"00:05"},{"id":1,time:"00:15"},{"id":1,time:"00:20"},{"id":2,time:"00:05"},{"id":3,time:"00:05"},{"id":4,time:"00:35"}]}
      
      var result = Object.entries(obj).reduce((c, v) => {
        c[v[0]] = Object.values(v[1].reduce((a, o) => {
          a[o.time] = a[o.time] || [];
          a[o.time].push(o);
          return a;
        }, {}));
        return c;
      }, {});
      
      
      console.log(result);

      【讨论】:

        猜你喜欢
        • 2020-11-19
        • 2020-11-10
        • 2015-10-22
        • 2013-06-23
        • 1970-01-01
        • 2021-12-17
        • 1970-01-01
        • 1970-01-01
        • 2021-11-19
        相关资源
        最近更新 更多