提问人:MB13534 提问时间:2/22/2022 更新时间:8/15/2023 访问量:481
通过选定的属性将对象数组转换为对象的子数组 (javascript)
Convert array of objects into subarrays of objects by a selected property (javascript)
问:
我希望获取一个对象数组,并根据所选对象属性将其转换为子数组
例如:
[
{foo: 1, bar: a}, {foo: 2, bar: b}, {foo: 1, bar: c}, {foo: 2, bar: d}
]
使用 foo 属性创建子数组将变为:
[
[
{foo: 1, bar: a}, {foo: 1, bar: c},
],
[
{foo: 2, bar: b}, {foo: 2, bar: d}
]
]
我想不出一个有效的方法。我一直在求助于创建一组我选择的值的所有唯一属性值,然后多次暴力破解它。
const distinctProperties = [...new Set(originalArray.map(item => item.foo))]
const newArray = distinctProperties.map(item => originalArray.filter(obj => obj.foo === item))
提前感谢您在这里提供一些建议!
答:
2赞
cmgchess
2/22/2022
#1
可以用 .您可以将其包装在另一个函数上,以按所需的键进行分组。reduce
在这里,我根据 的值进行分组,并将像这样foo
res
{
1: [{
bar: "a",
foo: 1
}, {
bar: "c",
foo: 1
}],
2: [{
bar: "b",
foo: 2
}, {
bar: "d",
foo: 2
}]
}
那么我用它来获得你想要的数组格式Object.values
let a =[
{foo: 1, bar: 'a'}, {foo: 2, bar: 'b'}, {foo: 1, bar: 'c'}, {foo: 2, bar: 'd'}
]
let res= Object.values(a.reduce((acc,curr)=> {
if(!acc[curr.foo])acc[curr.foo]=[];
acc[curr.foo].push(curr)
return acc;
},{}))
console.log(res)
作为将键名作为输入的通用函数
let a =[
{foo: 1, bar: 'a'}, {foo: 2, bar: 'b'}, {foo: 1, bar: 'c'}, {foo: 2, bar: 'd'}
]
let groupByValue = (arr,key) => {
return Object.values(arr.reduce((acc,curr)=> {
if(!acc[curr[key]])acc[curr[key]]=[];
acc[curr[key]].push(curr)
return acc;
},{}))
}
let res1 = groupByValue(a,'foo')
let res2 = groupByValue(a,'bar')
console.log(res1)
console.log(res2)
评论
0赞
MB13534
2/22/2022
这是完美的。非常感谢!
评论