繁体   English   中英

如何从一组复杂的对象中获取一组唯一的属性

[英]How to get an array of unique properties from an array of complex objects

我有一个类似于的对象数组

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"]}
]

您可以使用Map将writer保留为键,然后在数组上调用reduce将文档映射到writer,然后在Map对象上调用values()

const ret = Array.from(array.reduce((acc, val) => {
  val.writers.forEach(({ name }) => {
    let w = acc.get(name) || { name: name, documents: [] };
    w.documents = w.documents.concat(val.documentId);
    acc.set(name, w);
  });
  return acc;
}, new Map()).values());

console.log(ret);

您可以选择一个包含所有名称和相关文档的Map 如果没有可用的名称映射,则创建一个新条目。

然后结束,获取地图的所有对象。

 var 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" }] }], map = new Map, result; array.forEach(function (o) { o.writers.forEach(function ({ name }) { map.has(name) || map.set(name, { name, documents: [] }); map.get(name).documents.push(o.documentId); }); }); result = Array.from(map.values()); console.log(result); 
 .as-console-wrapper { 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)

https://jsfiddle.net/50oph5g4/1/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM