通过多个值将对象分组并合并重复项

时间:2019-11-28 16:32:23

标签: javascript arrays javascript-objects

我有一个看起来像这样的数据数组:

{
  "data": [
    {
      "id": "20200722_3",
      "eventDate": "2020-07-22T00:00:00",
      "eventName": "Football",
      "eventDetails": [
        "Men's First Round (2 matches)"
      ],
      "eventVenue": "Venue A"
    },
    {
      "id": "20200722_1",
      "eventDate": "2020-07-22T00:00:00",
      "eventName": "Football",
      "eventDetails": [
        "Men's First Round (2 matches)"
      ],
      "eventVenue": "Venue B"
    }
  ]
}

现在,我想按多个属性对数据进行分组。例如,通过eventDateeventNameeventDetailseventVenue。我已经完成了从this post引用的这段代码的操作:

const groupBy = (array, attrs) => {
  var output = [];
  for (var i = 0; i < array.length; ++i) {
    var ele = array[i];
    var groups = output;
    for (var j = 0; j < attrs.length; ++j) {
      var attr = attrs[j];
      var value = ele[attr];
      var gs = groups.filter(g => {
        return g.hasOwnProperty('label') && g['label'] === value;
      });
      if (gs.length === 0) {
        var g = {};
          if (isArray.g['label'] ) {

          }
        g['label'] = value;
        g['groups'] = [];
        groups.push(g);
        groups = g['groups'];
      } else {
        groups = gs[0]['groups'];
      }
    }
    groups.push(ele);
  }
  return output;
}

var result = groupBy(data, ['eventDate', 'eventName', 'eventDetails', 'eventVenue'])

哪个结果如下:

[{
    "label": "2020-07-23T00:00:00",
    "groups": [{
        "label": "Football",
        "groups": [{
            "label": [
              "Men's First Round (2 matches)"
            ],
            "groups": [{
              "label": "Venue A",
              "groups": [
                "Object"
              ]
            }]
          },
          {
            "label": [
              "Men's First Round (2 matches)"
            ],
            "groups": [{
              "label": "Venue B",
              "groups": [
                "Object"
              ]
            }]
          }
        }]
    }]
}]

您可以看到,对于上面的输出,有两个单独的“组”,其标签为"Men's First Round (2 matches)"。我试图弄清楚如何合并这些具有重复值的对象?我正在寻找可以输出以下内容的东西:

[{
    "label": "2020-07-23T00:00:00",
    "groups": [{
        "label": "Football",
        "groups": [{
            "label": [
              "Men's First Round (2 matches)"
            ],
            "groups": [{
              "label": "Venue A",
              "groups": [
                "Object"
              ]
            },
            {
              "label": "Venue B",
              "groups": [
                "Object"
              ]
            }]
        }]
    }]
}]

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

对于那些好奇的人,我将分享我想出的答案。 对于我的需求,我知道如果带有eventName的数组仅包含1个属性,则它可能是重复的。因此,为了解决此问题,我将只有1个值的数组转换为字符串:

if (ele[attr] && ele[attr].length === 1) {
  var value = ele[attr].toString();
} else {
  var value = ele[attr];
}