Javascript 如何从复杂对象数组中获取唯一属性数组
我有一个类似于的对象数组Javascript 如何从复杂对象数组中获取唯一属性数组,javascript,arrays,typescript,ecmascript-6,Javascript,Arrays,Typescript,Ecmascript 6,我有一个类似于的对象数组 const array = [ { documentId: "document1", writers: [ { name: "writer1", date: "2017-12-11" }, { name: "writer2", date: "2017-12-11" } ] }, {
const array = [
{
documentId: "document1",
writers: [
{
name: "writer1",
date: "2017-12-11"
},
{
name: "writer2",
date: "2017-12-11"
}
]
},
{
documentId: "document2",
writers: [
{
name: "writer1",
date: "2017-12-11"
},
{
name: "writer3",
date: "2017-12-11"
}
]
},
{
documentId: "document3",
writers: [
{
name: "writer3",
date: "2017-12-11"
},
{
name: "writer4",
date: "2017-12-11"
}
]
},
我试图提取所有唯一编写者的姓名,并将其与他们编写的所有文档进行匹配,以便最终的数组如下所示:
const finalArray = [
{name: "writter1", documents: ["document1", "document2"]},
{name: "writter2", documents: ["document1"]},
{name: "writter3", documents: ["document2", "document3"]},
{name: "writter4", documents: ["document3"]}
]
您可以选择一个包含所有名称和相关文档的。如果名称没有可用的映射,则创建一个新条目
A然后结束,获取地图的所有对象
var数组=[{documentId:document1,编写者:[{name:writer1,日期:2017-12-11},{name:writer2,日期:2017-12-11}]},{documentId:document2,编写者:[{name:writer1,日期:2017-12-11},{name:writer3,日期:2017-12-11},{documentId:document3,编写者:[{name:writer3,日期:2017-12-11},{name:writer4,日期:2017-12-11},
地图=新地图,
后果
array.foreacho函数{
o、 writers.forEachfunction{name}{
map.hasname | | map.setname,{name,documents:[]};
map.getname.documents.pusho.documentId;
};
};
结果=Array.frommap.values;
console.logresult;
.as console wrapper{max height:100%!important;top:0;}您可以使用一个包含所有名称和关联文档的。如果名称没有可用的映射,则创建一个新条目
A然后结束,获取地图的所有对象
var数组=[{documentId:document1,编写者:[{name:writer1,日期:2017-12-11},{name:writer2,日期:2017-12-11}]},{documentId:document2,编写者:[{name:writer1,日期:2017-12-11},{name:writer3,日期:2017-12-11},{documentId:document3,编写者:[{name:writer3,日期:2017-12-11},{name:writer4,日期:2017-12-11},
地图=新地图,
后果
array.foreacho函数{
o、 writers.forEachfunction{name}{
map.hasname | | map.setname,{name,documents:[]};
map.getname.documents.pusho.documentId;
};
};
结果=Array.frommap.values;
console.logresult;
.作为控制台包装{max height:100%!important;top:0;}也许会有一个更优雅的map reduce解决方案。不管怎样,即使它很难看,这也会起作用:
const array = //your data
var output = []
for (let i = 0; i < array.length; i++)
for (let k = 0; k < array[i].writers.length; k++) {
let t = output.find(function(a){return array[i].writers[k].name === a.name})
if (t)
t.documents.push(array[i].documentId)
else
output.push({name: array[i].writers[k].name, documents: [array[i].documentId]})
}
console.log(output)
也许会有一个更优雅的map reduce解决方案。不管怎样,即使它很难看,这也会起作用:
const array = //your data
var output = []
for (let i = 0; i < array.length; i++)
for (let k = 0; k < array[i].writers.length; k++) {
let t = output.find(function(a){return array[i].writers[k].name === a.name})
if (t)
t.documents.push(array[i].documentId)
else
output.push({name: array[i].writers[k].name, documents: [array[i].documentId]})
}
console.log(output)
您可以使用Map将writer保留为键,然后调用数组上的reduce将文档映射到writer,然后调用Map对象上的值:
您可以使用Map将writer保留为键,然后调用数组上的reduce将文档映射到writer,然后调用Map对象上的值:
欢迎来到SO。请包括尝试的解决方案,为什么它们不起作用,以及预期的结果。这将真正帮助我们解决代码的问题。谢谢欢迎来到SO。请包括尝试的解决方案,为什么它们不起作用,以及预期的结果。这将真正帮助我们解决代码的问题。谢谢