按组名和子项对对象数组进行分组
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}));
我有一组对象。我需要按 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}));