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。请包括尝试的解决方案,为什么它们不起作用,以及预期的结果。这将真正帮助我们解决代码的问题。谢谢