合并给定数据的键和值

时间:2018-03-12 22:16:24

标签: javascript

我有以下数据集:

var data = [{
  key: "A",
  value: "abc"
}, {
  key: "A",
  value: "def"
}, {
  key: "B",
  value: "abc"
}, {
  key: "B",
  value: "def"
}, {
  key: "B",
  value: "ghi"
}, {
  key: "A",
  value: "jkl"
}];

我希望以下列方式组合数据集:

var combinedData = [{
  key: ["A", "B"],
  value: ["abc", "def"]
}, {
  key: ["A"],
  value: ["ghi"]
}, {
  key: ["B"],
  value: ["jkl"]
}];

到目前为止,我尝试过的代码引导我:

var myResult = [{
  key: "A",
  value: ["abc", "def", "ghi"]
}, {
  key: "B",
  value: ["abc", "def", "jkl"]
}];

用于进入上述场景的代码:

var group_to_values = data.reduce(function (obj, item) {
    obj[item.key] = obj[item.key] || [];
    obj[item.key].push(item.value);
    return obj;
}, {});

var myResult = Object.keys(group_to_values).map(function (key) {
    return {key: key, value: group_to_values[key]};
});

我不知道该怎样才能继续......其中一个想法是检查一个是否是其他的子集,如果是值并将它们结合起来......性能不会成为问题

1 个答案:

答案 0 :(得分:0)

您可以使用函数reduce来构建所需的输出。

辅助函数像includesevery一样用于查找对象并进行必要的比较。

var data = [{  key: "B",  value: "ghi"}, { key: "A",  value: "abc"}, {  key: "A",  value: "def"}, {  key: "B",  value: "abc"}, {  key: "B",  value: "def"}, {  key: "A",  value: "jkl"}, { key: "A",  value: "ele"}, { key: "B",  value: "ele"}];

var combinedData = Object.entries(data.reduce((a, c) => {
  if (a[c.value]) a[c.value].key.push(c.key);
  else a[c.value] = { key: [c.key]};
  return a;
}, {})).reduce((a, [value, keyObj]) => {
  var found = a.find((o) => o.key.length === keyObj.key.length && o.key.every((k) => keyObj.key.includes(k)));
  if (found) {
    found.value.push(value);
  } else {
    a.push({
      key: keyObj.key,
      value: [value]
    });
  }
  
  return a;
}, []);

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