我有以下数据集:
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]};
});
我不知道该怎样才能继续......其中一个想法是检查一个是否是其他的子集,如果是值并将它们结合起来......性能不会成为问题
答案 0 :(得分:0)
您可以使用函数reduce
来构建所需的输出。
辅助函数像includes
和every
一样用于查找对象并进行必要的比较。
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; }