对数组值进行分组并添加属性
Group array values and add properties
有谁知道通过对象键对对象数组进行分组的方法吗?例如,我有一些汽车对象:
const cars = [
"fiat-palio",
"fiat-stilo",
"fiat-strada",
"fiat-uno",
"fiat-uno",
"gm-corsa",
"gm-celta",
"ford-fiesta",
"volkswagen-gol",
"volkswagen-gol",
"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
}
}
您可以使用数组的 reduce 方法来生成所需的输出。
reduce
在每次迭代中采用数组先前和当前项目以及 returns 标量值。 here the documentation
const cars = [
"fiat-palio",
"fiat-stilo",
"fiat-strada",
"fiat-uno",
"fiat-uno",
"gm-corsa",
"gm-celta",
"ford-fiesta",
"volkswagen-gol",
"volkswagen-gol",
"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)
您可以拆分每辆车并破坏数组以获取品牌和型号。确定这些值后,只需将这些值分布在一个 reducer 中即可。
const cars = [
"fiat-palio", "fiat-stilo", "fiat-strada", "fiat-uno", "fiat-uno",
"gm-corsa", "gm-celta",
"ford-fiesta",
"volkswagen-gol", "volkswagen-gol", "volkswagen-gol", "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
函数即可。
有谁知道通过对象键对对象数组进行分组的方法吗?例如,我有一些汽车对象:
const cars = [
"fiat-palio",
"fiat-stilo",
"fiat-strada",
"fiat-uno",
"fiat-uno",
"gm-corsa",
"gm-celta",
"ford-fiesta",
"volkswagen-gol",
"volkswagen-gol",
"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
}
}
您可以使用数组的 reduce 方法来生成所需的输出。
reduce
在每次迭代中采用数组先前和当前项目以及 returns 标量值。 here the documentation
const cars = [
"fiat-palio",
"fiat-stilo",
"fiat-strada",
"fiat-uno",
"fiat-uno",
"gm-corsa",
"gm-celta",
"ford-fiesta",
"volkswagen-gol",
"volkswagen-gol",
"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)
您可以拆分每辆车并破坏数组以获取品牌和型号。确定这些值后,只需将这些值分布在一个 reducer 中即可。
const cars = [
"fiat-palio", "fiat-stilo", "fiat-strada", "fiat-uno", "fiat-uno",
"gm-corsa", "gm-celta",
"ford-fiesta",
"volkswagen-gol", "volkswagen-gol", "volkswagen-gol", "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
函数即可。