![](/img/trans.png)
[英]How to get unique an array of objects back from a complex an array of objects?
[英]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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.