如何在过滤重复项时将一个对象数组拆分为多个对象数组?

How do I split an array of objects into multiple arrays of objects while filtering for duplicates?

好的,我知道这是一项艰巨的任务。

这是我的情况,假设我有下面的对象数组

var fullData = [{foo1: bar1, foo2: bar2, foo3: bar3}, 
                {foo1: bar4, foo2: bar5, foo3: bar6}, 
                {foo1: bar7, foo2: bar8, foo3: bar6}]

我希望将其更改为

[{name: bar1, label: bar1}, {name: bar4, label: bar4},{name: bar7, label: bar7}]

[{name: bar2, label: bar2}, {name: bar5, label: bar5},{name: bar8, label: bar8}]

[{name: bar3, label: bar3}, {name: bar6, label: bar6}]

我从另一个将 AoO 拆分为数组对象的线程中找到了以下内容。

var result = res.body.reduce((r, o) => {
                    Object.entries(o).forEach(([k, v]) => (r[k] = r[k] || []).push(v));
                    return r;
                }, Object.create(null));

但它不会过滤重复项,也不会按照我上面标记的方式格式化数据,我无法弄清楚上面的函数是如何工作的。对于重复项,我选择在 result 的每个单独元素上使用 lodash 中的 _.uniq 但卡在 'name' 和 'label' 格式上,所以我想我会问更多如果有办法将所有这些合并到一个函数中,比我更有经验的程序员。

您可以在将元素推送到数组之前添加检查数组是否包含元素,方法是更改​​此:

([k, v]) => (r[k] = r[k] || []).push(v)

对此:

r[k] = r[k] || []
if(!r[k].includes(v)) r[k].push(v)

var fullData = [{foo1: 'bar1', foo2: 'bar2', foo3: 'bar3'}, 
                {foo1: 'bar4', foo2: 'bar5', foo3: 'bar6'}, 
                {foo1: 'bar7', foo2: 'bar8', foo3: 'bar6'}]
                
var result = fullData.reduce((r, o) => {
   Object.entries(o).forEach(([k, v]) => {
      r[k] = r[k] || []
      if(!r[k].includes(v)) r[k].push(v)
   });
   return r;
 }, 
 Object.create(null));

console.log(result)

如果您希望将结果展平为数组数组,您可以遍历先前结果的条目并将其推入新数组

var fullData = [{foo1: 'bar1', foo2: 'bar2', foo3: 'bar3'}, 
                {foo1: 'bar4', foo2: 'bar5', foo3: 'bar6'}, 
                {foo1: 'bar7', foo2: 'bar8', foo3: 'bar6'}]
                
var tmpResult = fullData.reduce((r, o) => {
   Object.entries(o).forEach(([k, v]) => {
      r[k] = r[k] || []
      if(!r[k].includes(v)) r[k].push(v)
   });
   return r;
 }, 
 Object.create(null));

var result = [];
Object.keys(tmpResult).forEach(k => {
  result.push(
    tmpResult[k].map(v => ({name: k, value: v}))
  );
})
console.log(result)

我知道这似乎效率低下,但我确信这值得一试。