根据数组对象列表对 Javascript 个对象进行分组
Group Javascript object based on Array Object list
我正在尝试找到一种方法来根据组 array
转换此对象列表。我发现棘手的部分是遍历组数组并将对象应用于多个位置(如果有多个组)。
我也试图忽略任何不属于任何事物的群体。我试过使用 reduce
函数,但我无法通过组数组进行迭代。
let cars =
[
{
"group":[],
"name": "All Makes",
"code": ""
},
{
"group":["Group A"],
"name": "BMW",
"code": "X821"
},
{
"group":["Group B"],
"name": "Audi",
"code": "B216"
},
{
"group":["Group B"],
"name": "Ford",
"code": "P385"
},
{
"group":["Group B", "Group C"],
"name": "Mercedes",
"code": "H801"
},
{
"group":["Group C"],
"name": "Honda",
"code": "C213"
}
]
变成这样:
let cars = {
"Group A": [
{
name: "BMW",
code: "X821",
}
],
"Group B": [
{
name: "Audi",
code: "B216"
},
{
name: "Ford",
code: "P385"
},
{
name: "Mercedes",
code: "H801"
}
],
"Group C":[
{
name: "Mercedes",
code: "H801"
},
{
name:"Honda",
code: "C213"
}
]
};
我已经尝试使用 reduce 来完成此操作,但如果它在多个组中,则分组不会复制。
let result = cars.reduce(function(x, {group, name}){
return Object.assign(x, {[group]:(x[group] || [] ).concat({group, name})})
}, {});
如能提供帮助,我们将不胜感激。
您可以使用 .reduce()
循环遍历 cars
中的每个汽车对象。对于给定汽车的每个 group
数组,您可以使用 .forEach()
然后将该组作为键添加到累加器。如果累加器中已经设置了分组,则可以抓取分组的对象数组,否则,可以创建一个新数组[]
。一旦你有了一个数组,你就可以使用 .concat()
将对象添加到数组中。由于我们在 group
数组上使用 .forEach()
,如果对象为空,它不会将对象添加到累积对象中,因为 .forEach()
不会遍历空数组。
参见下面的示例:
const cars = [{ "group":[], "name": "All Makes", "code": "" }, { "group":["Group A"], "name": "BMW", "code": "X821" }, { "group":["Group B"], "name": "Audi", "code": "B216" }, { "group":["Group B"], "name": "Ford", "code": "P385" }, { "group":["Group B", "Group C"], "name": "Mercedes", "code": "H801" }, { "group":["Group C"], "name": "Honda", "code": "C213" } ];
const res = cars.reduce((acc, {group, ...r}) => {
group.forEach(key => {
acc[key] = (acc[key] || []).concat({...r}); // copy r so it is a different reference for each grouped array
});
return acc;
}, {});
console.log(res);
一些基本方法。 @Nick 的好多了。
let cars = [{
"group": [],
"name": "All Makes",
"code": ""
},
{
"group": ["Group A"],
"name": "BMW",
"code": "X821"
},
{
"group": ["Group B"],
"name": "Audi",
"code": "B216"
},
{
"group": ["Group B"],
"name": "Ford",
"code": "P385"
},
{
"group": ["Group B", "Group C"],
"name": "Mercedes",
"code": "H801"
},
{
"group": ["Group C"],
"name": "Honda",
"code": "C213"
}
]
let newCars = {};
cars.forEach(o => {
o.group.forEach(g => {
if (!newCars[g])
newCars[g] = [];
newCars[g].push({
name: o.name,
code: o.code
});
});
});
console.log(newCars);
我正在尝试找到一种方法来根据组 array
转换此对象列表。我发现棘手的部分是遍历组数组并将对象应用于多个位置(如果有多个组)。
我也试图忽略任何不属于任何事物的群体。我试过使用 reduce
函数,但我无法通过组数组进行迭代。
let cars =
[
{
"group":[],
"name": "All Makes",
"code": ""
},
{
"group":["Group A"],
"name": "BMW",
"code": "X821"
},
{
"group":["Group B"],
"name": "Audi",
"code": "B216"
},
{
"group":["Group B"],
"name": "Ford",
"code": "P385"
},
{
"group":["Group B", "Group C"],
"name": "Mercedes",
"code": "H801"
},
{
"group":["Group C"],
"name": "Honda",
"code": "C213"
}
]
变成这样:
let cars = {
"Group A": [
{
name: "BMW",
code: "X821",
}
],
"Group B": [
{
name: "Audi",
code: "B216"
},
{
name: "Ford",
code: "P385"
},
{
name: "Mercedes",
code: "H801"
}
],
"Group C":[
{
name: "Mercedes",
code: "H801"
},
{
name:"Honda",
code: "C213"
}
]
};
我已经尝试使用 reduce 来完成此操作,但如果它在多个组中,则分组不会复制。
let result = cars.reduce(function(x, {group, name}){
return Object.assign(x, {[group]:(x[group] || [] ).concat({group, name})})
}, {});
如能提供帮助,我们将不胜感激。
您可以使用 .reduce()
循环遍历 cars
中的每个汽车对象。对于给定汽车的每个 group
数组,您可以使用 .forEach()
然后将该组作为键添加到累加器。如果累加器中已经设置了分组,则可以抓取分组的对象数组,否则,可以创建一个新数组[]
。一旦你有了一个数组,你就可以使用 .concat()
将对象添加到数组中。由于我们在 group
数组上使用 .forEach()
,如果对象为空,它不会将对象添加到累积对象中,因为 .forEach()
不会遍历空数组。
参见下面的示例:
const cars = [{ "group":[], "name": "All Makes", "code": "" }, { "group":["Group A"], "name": "BMW", "code": "X821" }, { "group":["Group B"], "name": "Audi", "code": "B216" }, { "group":["Group B"], "name": "Ford", "code": "P385" }, { "group":["Group B", "Group C"], "name": "Mercedes", "code": "H801" }, { "group":["Group C"], "name": "Honda", "code": "C213" } ];
const res = cars.reduce((acc, {group, ...r}) => {
group.forEach(key => {
acc[key] = (acc[key] || []).concat({...r}); // copy r so it is a different reference for each grouped array
});
return acc;
}, {});
console.log(res);
一些基本方法。 @Nick 的好多了。
let cars = [{
"group": [],
"name": "All Makes",
"code": ""
},
{
"group": ["Group A"],
"name": "BMW",
"code": "X821"
},
{
"group": ["Group B"],
"name": "Audi",
"code": "B216"
},
{
"group": ["Group B"],
"name": "Ford",
"code": "P385"
},
{
"group": ["Group B", "Group C"],
"name": "Mercedes",
"code": "H801"
},
{
"group": ["Group C"],
"name": "Honda",
"code": "C213"
}
]
let newCars = {};
cars.forEach(o => {
o.group.forEach(g => {
if (!newCars[g])
newCars[g] = [];
newCars[g].push({
name: o.name,
code: o.code
});
});
});
console.log(newCars);