【问题标题】:group an array of object by group name and children按组名和子项对对象数组进行分组
【发布时间】:2021-04-28 22:54:51
【问题描述】:

我有一个对象数组。我需要按 groups 和 children 对这个数组进行分组。我尝试创建一个新数组,其中组名作为键,值作为按组分组的排序数组,但没有给我例外格式。我该怎么做?

以下是我的数据格式:

var data1 = [{
    "Name": "Apparel",
    "categoryId": 2742,
    "categoryName": "Men",
  },
  {
    "Name": "Fragrances",
    "categoryId": 2746,
    "categoryName": "Men",
  },
  {
    "Name": "Apparel",
    "categoryId": 2742,
    "categoryName": "Women",
  },
  {
    "Name": "Fragrances",
    "categoryId": 2746,
    "categoryName": "Women",
  }
];

预期输出是:

var data2 = [{
    "categoryName": "Men",
    "children": [{
        "Name": "Apparel",
        "categoryId": 2742
      },
      {
        "Name": "Fragrances",
        "categoryId": 2746
      }
    ]
  },
  {
    "categoryName": "Women",
    "children": [{
        "Name": "Apparel",
        "categoryId": 2742
      },
      {
        "Name": "Fragrances",
        "categoryId": 2746
      }
    ]
  }
]

我使用了这个函数,但输出不如预期,但非常接近解决方案

function groupAndSort(array, groupField, sortField) {
  var groups = {}; // This object will end being keyed by groups, and elements will be arrays of the rows within the given array, which have been sorted by the sortField
  // Put all the rows into groups
  for (var i = 0; i < array.length; i++) {
    var row = array[i];
    var groupValue = row[groupField];
    groups[groupValue] = groups[groupValue] || [];
    groups[groupValue].push(row);
  }
  // Sort each group
  for (var groupValue in groups) {
    groups[groupValue] = groups[groupValue].sort(function(a, b) {
      return a[sortField] - b[sortField];
    });
  }
  // Return the results
  return groups;
}

groupAndSort(data1, "categoryName", "position"))

这是该代码的输出:

{
  Men: [{
  categoryId: 2742,
  categoryName: "Men",
  Name: "Apparel"
}, {
  categoryId: 2746,
  categoryName: "Men",
  Name: "Fragrances"
}],
  Women: [{
  categoryId: 2742,
  categoryName: "Women",
  Name: "Apparel"
}, {
  categoryId: 2746,
  categoryName: "Women",
  Name: "Fragrances"
}]
}

我非常接近解决方案,我只需要一些帮助即可按预期完成,非常感谢您的帮助

【问题讨论】:

    标签: javascript arrays sorting object grouping


    【解决方案1】:

    从您离开的地方开始,您所要做的就是遍历对象并将键和关联的数组推送到新的最终数组。

    const data = {
      Men: [{
      categoryId: 2742,
      categoryName: "Men",
      Name: "Apparel"
    }, {
      categoryId: 2746,
      categoryName: "Men",
      Name: "Fragrances"
    }],
      Women: [{
      categoryId: 2742,
      categoryName: "Women",
      Name: "Apparel"
    }, {
      categoryId: 2746,
      categoryName: "Women",
      Name: "Fragrances"
    }]
    }
    
    const final = [];
    
    for (const key in data) {
      final.push({
        categoryName: key,
        children: data[key]
      })
    }
    
    console.log(final);

    【讨论】:

      【解决方案2】:

      您需要分组对象的 Object.values()

      const group  = {}; 
      
      data1.forEach(({categoryName, ...rest})=>{
          group[categoryName] = group[categoryName] || {categoryName, children:[]};
          group[categoryName].children.push(rest)
      });
      
      const res = Object.values(group)
      
      console.log(res)
      <script>
      var data1 = [ 
                {
                 "Name": "Apparel",
                 "categoryId": 2742,
              "categoryName": "Men",
                },
                {
                 "Name": "Fragrances",
                 "categoryId": 2746,
                   "categoryName": "Men",
                },
                 {
                 "Name": "Apparel",
                 "categoryId": 2742,
                   "categoryName": "Women",
                },
                {
                 "Name": "Fragrances",
                 "categoryId": 2746,
                "categoryName": "Women",
                }
               ];
      </script>

      【讨论】:

        【解决方案3】:

        你的groups对象的key是categoryName,value是children数组,所以一个简单的映射:

          // Return the results
          // return groups;
          return Object.entries(groups).map(([categoryName, children]) => ({categoryName, children}));
        

        【讨论】:

        • 按预期工作,这是正确的解决方案,谢谢
        猜你喜欢
        • 2018-05-01
        • 2014-11-28
        • 1970-01-01
        • 2011-11-26
        • 2021-05-05
        • 2019-01-30
        • 2020-12-28
        • 2015-10-19
        相关资源
        最近更新 更多