我有一个对象数组,如下-
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)