0

I have an array of objects. I want to merge the objects in array with same 'label' attribute. With my code (pasted below), I am able to merge, but the merge is happening across all array of objects instead of objects within an array.

var pages= [
    {
         name: "page1", 
         list:{
           fields:[
             {name: "sHist", label: "Range", type: "long", searchable: false},
             {name: "sFuture", label: "Range", type: "long", searchable: false},
             {name: "ordersinPage1", label: "Orders", type: "long", searchable: false}
           ]
          }
    },
    {
         name: "page2", 
         list:{
           fields:[
             {name: "needs", label: "Needs", type: "long", searchable: false},
             {name: "fulfil", label: "Fulfill", type: "long", searchable: false},
             {name: "ordersinPage2", label: "Orders", type: "long", searchable: false}
           ]
          }
    }

  ]

The code I tried is below:

 let seen={};var totalFieldsObject ;
 pages.map((graphPage) => {
  totalFieldsObject = graphPage.list.fields.filter((entry) => {
      if (seen.hasOwnProperty(entry.label)) {
        let previous;
        previous = seen[entry.label];
        previous.name.push(entry.name);
        return false;
      }
      if (!Array.isArray(entry.name)) {
        entry.name = [entry.name];
      }
      seen[entry.label] = entry;
      return true;
    });
    });
  console.log(pages)

The expected Output :

var exprectedOutput=[
    {
         name: "page1", 
         list:{
           fields:[
             {name: ["sHist","sFuture"], label: "Range", type: "long", searchable: false}, 
             {name: ["ordersinPage1"], label: "Orders", type: "long", searchable: false}
           ]
          }
    },
    {
         name: "page2", 
         list:{
           fields:[
             {name: ["needs"], label: "Needs", type: "long", searchable: false},
             {name: ["fulfil"], label: "Fulfill", type: "long", searchable: false},
             {name: ["ordersinPage2"], label: "Orders", type: "long", searchable: false}
           ]
          }
    },

  ]

1 Answer 1

2

you'll need Array.reduce() to group the objects with same label :

var pages = [{
    name: "page1",
    list: {
      fields: [{
          name: "sHist",
          label: "Range",
          type: "long",
          searchable: false
        },
        {
          name: "sFuture",
          label: "Range",
          type: "long",
          searchable: false
        },
        {
          name: "ordersinPage1",
          label: "Orders",
          type: "long",
          searchable: false
        }
      ]
    }
  },
  {
    name: "page2",
    list: {
      fields: [{
          name: "needs",
          label: "Needs",
          type: "long",
          searchable: false
        },
        {
          name: "fulfil",
          label: "Fulfill",
          type: "long",
          searchable: false
        },
        {
          name: "ordersinPage2",
          label: "Orders",
          type: "long",
          searchable: false
        }
      ]
    }
  }

]

const result = pages.map(page =>
  page.list.fields.reduce((all, curr) => {
    const ndx = all.findIndex(e => e.label === curr.label); // look for the current element in the list
    if (ndx > -1) { 
      // if found, concat the names in an array
      // array.flat() will transform this : [["a"], "b"] into : ["a", "b"]
      all[ndx].name = [all[ndx].name, curr.name].flat();
    } else {
      // otherwise, edit the name property to become an array and push it.      
      all.push({ ...curr, name: [curr.name]})
    }
    return all;
  }, [])
)

console.log(result)

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

1 Comment

thankyou. The "name" attribute should be an array even the grouping does not exist. Updated the expected output

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.