4 回答

TA貢獻1735條經驗 獲得超5個贊
您可以使用一個對象來存儲信息,以省份為鍵。
const arr = [
{GenderEn: "Male", ProvinceEn: "Chonburi"},
{GenderEn: "Male", ProvinceEn: "Chonburi"},
{GenderEn: "Female", ProvinceEn: "Chonburi"},
{GenderEn: "Female", ProvinceEn: "Chonburi"},
{GenderEn: "Male", ProvinceEn: "BKK"},
{GenderEn: "Female", ProvinceEn: "BKK"}
];
var res = Object.values(
arr.reduce((acc,{GenderEn: gender, ProvinceEn: Province})=>{
const p = acc[Province] = acc.hasOwnProperty(Province)?acc[Province]: {Male: 0, Female: 0, Sum: 0, Province};
p[gender]++, p.Sum++;
return acc;
}, {})
);
console.log(res);

TA貢獻1839條經驗 獲得超15個贊
讓我們?yōu)檫@個分解對象括號語法和對象獲取器!
由于您特別要求將數(shù)組作為輸出,而不是對象:
const data = [
{GenderEn: "Male", ProvinceEn: "Chonburi"},
{GenderEn: "Male", ProvinceEn: "Chonburi"},
{GenderEn: "Female", ProvinceEn: "Chonburi"},
{GenderEn: "Female", ProvinceEn: "Chonburi"},
{GenderEn: "Male", ProvinceEn: "BKK"},
{GenderEn: "Female", ProvinceEn: "BKK"}
];
var output = [];
for (entry of data) {
let el = output.find(e => e.Province == entry.ProvinceEn);
if (el) { //If output does contain province entry, add data to it
el[entry.GenderEn]++;
}
else { //Else, create it
output.push({
Male: entry.GenderEn == 'Male' ? 1 : 0,
Female: entry.GenderEn == 'Female' ? 1 : 0,
get Sum() { //If sum is a getter, you'll never have to set it manually
return this.Male + this.Female;
},
Province: entry.ProvinceEn,
});
}
}
console.log(output);
.as-console-wrapper { top: 0; max-height: 100% !important; }

TA貢獻1993條經驗 獲得超6個贊
您必須首先按鍵對數(shù)據(jù)進行分組,在本例中為ProvinceEn。擁有組后,您可以將統(tǒng)計信息映射到新對象。
我提供了通用的分組和匯總功能。
const rawData = [
{ "GenderEn": "Male" , "ProvinceEn": "Chonburi" },
{ "GenderEn": "Male" , "ProvinceEn": "Chonburi" },
{ "GenderEn": "Female" , "ProvinceEn": "Chonburi" },
{ "GenderEn": "Female" , "ProvinceEn": "Chonburi" },
{ "GenderEn": "Male" , "ProvinceEn": "BKK" },
{ "GenderEn": "Female" , "ProvinceEn": "BKK" }
]
const count = (data, key, value) =>
data.filter(item => item[key] === value).length
const groupBy = (data, key) =>
data.reduce((groups, item) =>
(existingArr => ({...groups, [item[key]]: [...existingArr, item]}))
(groups[item[key]] || []), {})
const summarize = (data, groupKey, mapper) =>
(groups => Object.entries(groups).map(entry => mapper.apply(null, entry)))
(groupBy(data, groupKey))
console.log(summarize(rawData, 'ProvinceEn', (key, data) => ({
'Male' : count(data, 'GenderEn', 'Male'),
'Female' : count(data, 'GenderEn', 'Female'),
'Sum' : data.length,
'ProvinceEn' : key
})))
.as-console-wrapper { top: 0; max-height: 100% !important; }
如果上面的代碼是整體式的,這就是它的樣子。它非常像 LISP。;)
const rawData = [
{ "GenderEn": "Male" , "ProvinceEn": "Chonburi" },
{ "GenderEn": "Male" , "ProvinceEn": "Chonburi" },
{ "GenderEn": "Female" , "ProvinceEn": "Chonburi" },
{ "GenderEn": "Female" , "ProvinceEn": "Chonburi" },
{ "GenderEn": "Male" , "ProvinceEn": "BKK" },
{ "GenderEn": "Female" , "ProvinceEn": "BKK" }
]
const summary = (groups =>
Object.keys(groups).map(key => ({
'Male' : groups[key].filter(item => item['GenderEn'] === 'Male').length,
'Female' : groups[key].filter(item => item['GenderEn'] === 'Female').length,
'Sum' : groups[key].length,
'ProvinceEn' : key
})))
(rawData.reduce((groups, item) =>
(existingArr => ({...groups, [item['ProvinceEn']]: [...existingArr, item]}))
(groups[item['ProvinceEn']] || []), {}), 'ProvinceEn')
console.log(summary)
.as-console-wrapper { top: 0; max-height: 100% !important; }

TA貢獻1789條經驗 獲得超8個贊
const test = [
{GenderEn: "Male", ProvinceEn: "Chonburi"},
{GenderEn: "Male", ProvinceEn: "Chonburi"},
{GenderEn: "Female", ProvinceEn: "Chonburi"},
{GenderEn: "Female", ProvinceEn: "Chonburi"},
{GenderEn: "Male", ProvinceEn: "BKK"},
{GenderEn: "Female", ProvinceEn: "BKK"}
]
function getProvinceSum(arr){
return arr.reduce((output, arrObj) => {
if(!output.some(outputObj => outputObj.Province == arrObj.ProvinceEn)){
output.push({
Male: arrObj.GenderEn == "Male" ? 1 : 0,
Female: arrObj.GenderEn == "Female" ? 1 : 0,
Sum: 1,
Province: arrObj.ProvinceEn
});
}else{
const outputObj = output.find(outputObj => outputObj.Province == arrObj.ProvinceEn);
arrObj.GenderEn == "Male" ? outputObj.Male += 1 : outputObj.Female += 1;
outputObj.Sum += 1;
}
return output;
},[]);
}
console.log(getProvinceSum(test));
添加回答
舉報