如何解决对数组值进行分组并添加属性
有人知道一种通过对象键对对象数组进行分组的方法吗?例如,我有很多汽车物品:
const cars = [
"fiat-palio","fiat-stilo","fiat-strada","fiat-uno","gm-corsa","gm-celta","ford-fiesta","volkswagen-gol","volkswagen-voyage"
]
我想按每个汽车制造商分组创建新的汽车对象阵列:
{
"fiat": {
"palio": 1,"stilo": 1,"strada": 1,"uno": 2
},"gm": {
"corsa": 1,"celta": 1
},"ford": {
"fiesta": 1
},"volkswagen": {
"gol": 3,"voyage": 1
}
}
解决方法
您可以使用array的reduce方法产生所需的输出。
reduce
在每次迭代中获取数组先前项和当前项,并返回标量值。 here the documentation
const cars = [
"fiat-palio","fiat-stilo","fiat-strada","fiat-uno","gm-corsa","gm-celta","ford-fiesta","volkswagen-gol","volkswagen-voyage"
];
let result = cars.reduce((obj,item) => {
let pair = item.split('-'); // split key and value
let mark = pair[0];
let model = pair[1];
if(!obj.hasOwnProperty(mark)) { // initialize new mark and model
obj[mark] = {};
obj[mark][model] = 1;
} else {
if(obj[mark].hasOwnProperty(model)) { // increment existing model
obj[mark][model] += 1;
} else { // initialize model of existing mark
obj[mark][model] = 1;
}
}
return obj;
},{})
console.log(result)
,
您可以拆分每辆车并破坏阵列,以获取品牌和型号。识别这些值之后,只需将这些值分布在一个减速器上即可。
const cars = [
"fiat-palio","volkswagen-voyage"
];
const frequency = cars.reduce((groups,car) => ({
...groups,...(([make,model]) => ({
[make] : {
...groups?.[make],[model] : (groups?.[make]?.[model] || 0) + 1
}
}))(car.split('-'))
}),{});
console.log(frequency);
.as-console-wrapper { top: 0; max-height: 100% !important; }
编码高尔夫乐趣
f=l=>l.reduce((g,c)=>({...g,...(([m,n])=>({[m]:{...g?.[m],[n]:(g?.[m]?.[n]||0)+1}}))(c.split('-'))}),{})
(104个字节)
用法:只需将cars
传递到上面的f
函数中即可。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。