Объединить объекты в массиве, который имеет одинаковое значение атрибута - PullRequest
0 голосов
/ 17 января 2019

У меня есть массив объектов. Я хочу объединить объекты в массиве с тем же атрибутом '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}
           ]
          }
    }

  ]

Код, который я пробовал ниже:

 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)

Ожидаемый результат:

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 Ответ

0 голосов
/ 17 января 2019

вам понадобится Array.reduce () для группировки объектов с одинаковой меткой:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...