Tengo una variedad de objetos como a continuación:
const books = [ { name:"abc", isbn: 123, tags: ["tagA","tagB","tagC"] }, { name:"xyz", isbn: 456, tags: ["tagB","tagC"] }, { name:"pqr", isbn: 456, tags: ["tagB"] } ]; Quiero agruparlo en función de las tags de cada objeto e insertar los objetos coincidentes en los valores de las tags , que es una matriz de cadenas. Mi salida esperada debe ser un objeto que tenga el valor agrupado como clave y el valor debe ser la matriz de valores coincidentes.
Mi salida esperada es-
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, }, ], }Hay preguntas similares para agrupar por valor clave; dado que desea agrupar según el valor de la clave, que es una matriz, podría hacer algo como esto:
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)Este es un 'agrupar por' muy estándar con un bucle adicional para agregar cada elemento a varios grupos.
Aquí usando la desestructuración para aislar la matriz de tags del resto del objeto del book , iterando sobre cada etiqueta creando una propiedad en el resultado usando una asignación lógica nula (??=) si aún no existe, y luego empujando un clon de cada book usando sintaxis extendida
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);