1

I have an array of objects like below -

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

I want to group it based on tags of each object, and push the matched objects into the tags values which is string array. My expected output shoulb be an object having the grouped value as key and the value should be the array of matched values.

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,  
     },
  ],
}
3
  • maybe show us what you've tried so far? Commented Jun 3, 2022 at 10:17
  • Does this answer your question? How can I group an array of objects by key? Commented Jun 3, 2022 at 10:18
  • This is just a standard group-by with an added loop to add each element to multiple groups Commented Jun 3, 2022 at 10:18

2 Answers 2

1

This is a very standard 'group by' with an extra loop to add each element to multiple groups.

Here using destructuring to isolate the tags array from the rest of the book object, iterating over each tag creating a property in the result using logical nullish assignment (??=) if it doesn't already exist, and then pushing a clone of each book using spread syntax

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);

Sign up to request clarification or add additional context in comments.

Comments

1

There are similar questions for grouping by key value; since you want to group based on value of key which is array, you could do something like this:

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)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.