skip to Main Content

How to group 2 arrays and push the matches to new array with status count, if status count repeats then increment the status

here compare array a’s id with array b assigned, if both are equal add a new key to a with count which contains the count of status.

I have tried with map but got the object seperately and was not able to seggrate it based on the id. please help

`const a = [
      {
        id: 1,
        name: "Mark",
      },
      {
        id: 2,
        name: "John",
      },
      {
        id: 3,
        name: "Ruth",
      }
    ]

    let b = [
      {
        assigned: [1],
        status: "C"
      },
      {
        assigned: [1, 2],
        status: "S"
      },
      {
        assigned: [2],
        status: "O"
      },
      {
        assigned: [2, 3],
        status: "C"
      }
    ];

const result = [{
      id: 1,
      name: "Mark",
      count: {
        "C": 1,
        "S": 1
      },
    },
    {
      id: 2,
      name: "John",
      count: {
        "C": 1,
        "S": 1,
        "O": 1
      },
    },
    {
      user_id: 3,
      name: "Ruth",
      count: {
        "C": 1
      },
    }
    ]`

`  const resultArr = []
  a.map(el => {
    b.map(elm => {
      if(elm.assigned.includes(el.id)){
            resultArr.push({...el, [elm.status]: 1})
          }
          })
    })`

3

Answers


  1. You can use a combination of Array.map() and Array.reduce() to get the desired result.

    For each element in the a array, we call b.reduce() to produce the output object for each value in the a array. This essentially involves checking each assigned array for the id of the element, and if it exists, incrementing the count for the relevant status.

    const a = [ { id: 1, name: "Mark", }, { id: 2, name: "John", }, { id: 3, name: "Ruth", } ]
    const b = [ { assigned: [1], status: "C" }, { assigned: [1, 2], status: "S" }, { assigned: [2], status: "O" }, { assigned: [2, 3], status: "C" } ];
    
    const result = a.map(({ id, name }) => {
        return b.reduce((acc, { assigned, status}) => {
            if (assigned.includes(id)) {
                acc.count[status] = (acc.count[status] || 0) + 1; 
            }
            return acc;
        }, { id, name, count: {} })
    })
    
    console.log('Result:', result)
    .as-console-wrapper { max-height: 100% !important; }
    Login or Signup to reply.
  2. const a = [{"id":1,"name":"Mark"},{"id":2,"name":"John"},{"id":3,"name":"Ruth"}]
    const b = [{"assigned":[1],"status":"C"},{"assigned":[1,2],"status":"S"},{"assigned":[2],"status":"O"},{"assigned":[2,3],"status":"C"}]
    
    const r = a.map(({id,name})=>
      ({id, name, count:b.reduce((acc,{assigned, status})=>
          (assigned.includes(id)&&(acc[status]=(acc[status]??0)+1),acc),{})}))
    
    console.log(r)
    Login or Signup to reply.
  3. Youcould take a hash table with id as key.

    const
        a = [{ id: 1, name: "Mark" }, { id: 2, name: "John" }, { id: 3, name: "Ruth" }],
        b = [{ assigned: [1], status: "C" }, { assigned: [1, 2], status: "S" }, { assigned: [2], status: "O" }, { assigned: [2, 3], status: "C" }],
        result = Object.values(b.reduce(
            (r, { assigned, status }) => {
                assigned.forEach(id =>
                    r[id].count[status] = (r[id].count[status] || 0) + 1
                );
                return r;
            },
            Object.fromEntries(a.map(o => [o.id, { ...o, count: {} }]))
        ));
    
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search