2 回答
TA贡献1909条经验 获得超7个赞
有时,与其试图在一次操作中完成所有事情,不如一步一步地做事情更有意义。例如,您的问题可以分为两个步骤。
按国家分组
离散组求和
现在我们所要做的就是创建一些构建块来帮助您实现这一结果。
通过...分组
按运算符分组很简单,您已经在这样做了。但我们可以通过使用地图使其更快一些。这使我们能够立即判断一个国家/地区组是否存在,而无需搜索我们的数组。
const groupBy = (array, selector) => {
return array.reduce((groups, value) => {
const key = selector(value);
const group = groups.get(key);
if (group == null) {
groups.set(key, [value]);
} else {
group.push(value);
}
return groups;
}, new Map());
};
const groups = groupBy(data, (d) => d["Country"]);
我们在这里使用array.reducereduce
将集合转换为单个值。
和
接下来,我们将使用求和运算符来遍历每个组并对选择器返回的内容求和。
const sum = (array, selector) => {
return array.reduce((s, value) => {
return s + selector(value);
}, 0);
};
这看起来应该与 非常相似groupBy。我们将reducing多个值合并为一个总和。
结果
现在,既然我们有了两个构建块,我们只需将它们单击在一起即可获得我们想要的结果。
const groups = groupBy(data, (v) => v["Country"])
const unitsSoldByCountry = Array.from(groups.entries())
.map(([country, sales]) => {
return {
"Country": country,
"Units Sold": sum(sales, (s) => s["Units Sold"])
};
});
我们groupBy
国家。然后,对于每个群体(国家),我们都会sum
增加他们的销售单位。我们在这里使用array.map运算符,因为我们希望如果有N
国家/地区,我们将返回N
求和记录。
const data = [
{
"Country": "USA",
"Units Sold": 1245.56
},
{
"Country": "Spain",
"Units Sold": 7843.50
},
{
"Country": "USA",
"Units Sold": 1435.99
},
{
"Country": "Uruguay",
"Units Sold": 594.20
}
];
const groupBy = (array, selector) => {
return array.reduce((groups, value) => {
const key = selector(value);
const group = groups.get(key);
if (group == null) {
groups.set(key, [value]);
} else {
group.push(value);
}
return groups;
}, new Map());
};
const sum = (array, selector) => {
return array.reduce((s, value) => {
return s + selector(value);
}, 0);
};
const groups = groupBy(data, (v) => v['Country'])
const unitsSoldByCountry = Array.from(groups.entries())
.map(([country, sales]) => {
return {
"Country": country,
"Units Sold": sum(sales, (s) => s["Units Sold"])
};
});
console.log(unitsSoldByCountry);
肯定有一些方法可以用更少的代码行来做到这一点。但我更喜欢可重用的组件,它们允许更多的声明性编程,使您的代码更易于阅读和更改。
TA贡献2016条经验 获得超9个赞
const data = [
{
"Country" : "USA",
"sold" : 15.56
},
{
"Country" : "USA",
"sold" : 1245.56
},
{
"Country" : "Spain",
"sold" : 7843.50
},
{
"Country" : "USA",
"sold" : 1435.99
},
{
"Country" : "Uruguay",
"sold" : 594.20
},
]
const usaEntries= data.filter(item => item.Country === 'USA')
const sum = pays.reduce((a, n) => (a + Number(n.sold)), 0);
第一行检索所有美国条目,第二行对所有商品的销售总额进行求和,它有两个参数,a 表示累加器,n 表示当前值,0 是将累加器初始化为零。
您也可以在一行中完成
const sum = data.filter(item => item.Country === 'USA').reduce((a, n) => (a + Number(n.sold)), 0);
您还可以将所有国家/地区分组到一个数组中
let group = data.reduce((a, n) => {
a[n.Country] = [...a[n.Country] || [], n];
return a;
}, {});
然后,您可以使用reduce对每个项目应用求和函数,以获得每个国家/地区的销售情况。
添加回答
举报