好的,我知道这是一个艰巨的任务。
这是我的情况,假设我有下面的物体阵列
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拆分为Arrays的对象。
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"one_answers"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)
我知道这似乎效率低下,但我相信这值得一试。