组对象数组与内部字符串数组javascript



我有一个对象数组,如下-

const books = [
{
name:"abc",
isbn: 123,
tags: ["tagA","tagB","tagC"]
},
{
name:"xyz",
isbn: 456,
tags: ["tagB","tagC"]
},
{
name:"pqr",
isbn: 456,
tags: ["tagB"]
}
];

我想根据每个对象的tags对其进行分组,并将匹配的对象推入tags值,这是字符串数组。我期望的输出应该是一个以分组值为键的对象,该值应该是匹配值的数组。

My Expected Output is-

const expected = {
"tagA" : [
{
name:"abc",
isbn: 123,  
},
],
"tagB" : [
{
name:"abc",
isbn: 123,  
},
{
name:"xyz",
isbn: 456,  
},
{
name:"pqr",
isbn: 456,  
},
],
"tagC" : [
{
name:"abc",
isbn: 123,  
},
{
name:"xyz",
isbn: 456,  
},
],
}

这是一个非常标准的'group by',带有一个额外的循环,用于将每个元素添加到多个组中。

这里使用解构将tags数组与book对象的其余部分隔离开来,迭代每个标记,使用逻辑空赋值(??=)在结果中创建属性,如果它不存在,然后使用扩展语法推送每个book的克隆

const books = [{ name: "abc", isbn: 123, tags: ["tagA", "tagB", "tagC"] }, { name: "xyz", isbn: 456, tags: ["tagB", "tagC"] }, { name: "pqr", isbn: 456, tags: ["tagB"] }];
const result = {};
for (const { tags, ...book } of books) {
for (const tag of tags) {
(result[tag] ??= []).push({...book});
}
}
console.log(result);

按键值分组也有类似的问题;由于您希望根据键的值(即数组)进行分组,因此您可以这样做:

const books = [
{
name:"abc",
isbn: 123,
tags: ["tagA","tagB","tagC"]
},
{
name:"xyz",
isbn: 456,
tags: ["tagB","tagC"]
},
{
name:"pqr",
isbn: 456,
tags: ["tagB"]
}
];
let grouped = {};
books.forEach((book)=>{
book.tags.forEach(tag=>{
if(!grouped[tag]) grouped[tag] = [{name:book.name,isbn:book.isbn}]
else grouped[tag].push({name:book.name,isbn:book.isbn})
})
})
console.log(grouped)