【问题标题】:Merge the objects within array which has same attribute value合并数组中具有相同属性值的对象
【发布时间】:2019-01-17 16:54:08
【问题描述】:

我有一个对象数组。我想将数组中的对象与相同的“标签”属性合并。使用我的代码(粘贴在下面),我可以合并,但合并发生在所有对象数组而不是数组中的对象。

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}
           ]
          }
    },

  ]

【问题讨论】:

    标签: javascript arrays json object array-merge


    【解决方案1】:

    您需要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)

    【讨论】:

    • 谢谢。即使分组不存在,“名称”属性也应该是一个数组。更新了预期的输出
    猜你喜欢
    • 2021-03-22
    • 2021-11-11
    • 2021-05-02
    • 2020-02-08
    • 2021-01-11
    • 2015-12-16
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    相关资源
    最近更新 更多