Javascript 如何使用es6转换对象数组

Javascript 如何使用es6转换对象数组,javascript,arrays,ecmascript-6,Javascript,Arrays,Ecmascript 6,我有这个阵列: const arr = [{field1: "xxx", format: "text", tags: [{id: 1, name: "test1"},{id: 3, name: "test3"}]}, {field1: "xxx", format: "audio", tags: [{id: 1, name: "test1"},{id: 2,

我有这个阵列:

const arr = [{field1: "xxx", format: "text", tags: [{id: 1, name: "test1"},{id: 3, name: "test3"}]},
 {field1: "xxx", format: "audio", tags: [{id: 1, name: "test1"},{id: 2, name: "test2"}]},
{field1: "xxx", format: "audio", tags: false},
 {field1: "yyy", format: "video", tags: [{id: 17, name: "test17"},{id: 22, name: "test22"}]}]
我想转换上面的数组,使其结果在使用es6时如下所示: 因此,基本上每个键都应该包含作为一个数组的所有唯一值

const res= [{field1:["xxx","yyy"],format:["audio","video","text"],tags:[{id: 1, name: "test1"},{id: 2, name: "test2"},{id: 3, name: "test3"},{id: 17, name: "test17"},{id: 22, name: "test22"}]]
const arr=[{
字段1:“xxx”,
格式:“文本”,
标签:[{
id:1,
名称:“test1”
}, {
id:3,
名称:“test3”
}]
},
{
字段1:“xxx”,
格式:“音频”,
标签:[{
id:1,
名称:“test1”
}, {
id:2,
名称:“test2”
}]
},
{
字段1:“xxx”,
格式:“音频”,
标签:false
},
{
字段1:“yyy”,
格式:“视频”,
标签:[{
身份证号码:17,
名称:“test17”
}, {
身份证号码:22,
名称:“test22”
}]
}
];
常数DoThat=()=>{
const field1Set=新集合();
const formatSet=new Set();
const tagsSet=新集合();
arr.map((数据)=>{
字段1集合添加(数据字段1);
formatSet.add(data.format);
让t;
如果(!!data.tags.length){
data.tags.map((tag)=>{
tagsSet.add(JSON.stringify(tag));
});
}
});
console.log({
字段1:[…字段1集],
格式:[…formatSet],
标记:[…标记集].map((标记)=>{
返回JSON.parse(标记)
})
});
};

DoThat()我们有一个对象数组,希望将其
减少为单个对象。我会开始写这个-

const result =
  input.reduce(merge, {})
我们将
合并
定义为-

const merge=(l,r)=>
Object.entries(r).reduce(update,l)
在这里,我们定义如何更新对象-

const update=(r[k,v])=>
赋值(r,{[k]:合并值(r[k],v)})
这取决于我们定义如何合并两个值,
mergeValues
-

const mergeValues=(l,r)=>
伊萨雷(左)和伊萨雷(右)
? […l,…r]。筛选器(布尔值)
:isArray(左)
? […l,r].过滤器(布尔值)
:l&r
? [左,右]
:l??R
它使用可读的别名,
isArray
-

const isArray=x=>
数组.isArray(x)
展开下面的代码段,以确认您自己的浏览器中的
merge
结果-

const merge=(l,r)=>
Object.entries(r).reduce(update,l)
常数更新=(r[k,v])=>
赋值(r,{[k]:合并值(r[k],v)})
常量合并值=(l,r)=>
伊萨雷(左)和伊萨雷(右)
? […l,…r]。筛选器(布尔值)
:isArray(左)
? […l,r].过滤器(布尔值)
:l&r
? [左,右]
:l??R
常数isArray=x=>
数组.isArray(x)
常量输入=
[{field1:“xxx”,格式:“text”,标记:[{id:1,名称:“test1”},{id:3,名称:“test3”},{field1:“xxx”,格式:“audio”,标记:[{id:1,名称:“test1”},{id:2,名称:“test2”},{field1:“xxx”,格式:“audio”,标记:false},{field1:“yyy”,格式:“video”,标记:[{id:17,名称:“test17”},{id:22,名称:“test22”}]
常数结果=
input.reduce(合并,{})

console.log(结果)
So。。。到目前为止,您尝试了什么?也不确定为什么要使用lodash。你可以用简单的js轻松做到这一点。@Kielstra编辑了我的问题,你将如何使用es6?为什么结果中的每个键都有一个单独的对象?这似乎有点毫无意义。所有东西都可以放在一个对象中,并带有一组键。此外,您现有的数据结构不是有效的Javascript。不能有这样开头的数组:
[11:{field1:“xxx”…