按组名和子项对对象数组进行分组

group an array of object by group name and children

我有一组对象。我需要按 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"
}]
}

我已经非常接近解决方案了,我只需要一些帮助就可以按预期实现,非常感谢您的帮助

从上次中断的地方开始,您只需遍历对象并将键和关联的数组推送到新的最终数组。

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);

您需要分组对象的 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>

groups 对象的键是 categoryName,值是 children 数组,所以一个简单的映射:

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