我尝试使用reduce来创建一个对象,其中包含列表中各个国家的出现百分比。
输入:
countriesList = ["US","US","US","UK","IT","IT"]
期望输出:
percCountriesList = [{"country": "US", "weight": 0.5}, {"country": "UK", "weight": 0.1666}, {"country": "IT", "weight": 0.3333}]
我如何计算百分比:
const countriesList = ["US","US","US","UK","IT","IT"]
const weightPercCountries = countriesList.reduce((pcts, x) => {
pcts[x] = (pcts, (pcts[x] ? pcts[x] : 0) + 100 / countriesList.length);
return pcts;
}, []);
console.log(weightPercCountries)
我有一个百分比表:
[50, 16.666666666666668, 33.33333333...]
现在,我如何才能建立所需的输出(国家+重量)“jsonized”?谢谢
2条答案
按热度按时间iq0todco1#
首先,你的代码会产生一个空数组(带有一些额外的属性),因为
x
在你的例子中是一个国家的快捷方式,而不是一个索引,所以如果你使用pcts[x] = ..
,你实际上是在使用pcts['us'] = ...
,这在大多数情况下对数组来说没有太大的意义。第二,如果你想在数组中有一个复杂的对象,你需要在某个地方创建它......例如,看下面的代码片段
1.我定义了
reduce
以返回object
,因此可以很容易地检查当前国家(由x
定义)是否已经包含。1.如果没有包含它,我就向对象添加一个新属性,该对象已经包含了结果中所需的所有属性(即
{ country: x, percentage: 0}
)1.现在,我已经确定了当前国家的对象存在,我可以通过它的名称访问它并更新百分比。您需要
50
还是0.5
由您决定。reduce
现在返回一个对象,如因此,要获取值的数组,只需使用
Object.values(...)
,它将对象的所有可枚举属性作为数组返回当然,您可以缩短
reduce
的回调(例如Andrew Park的回答)。但是为了可读性(特别是对于初学者),我决定使用更显式的代码...2ic8powd2#
如果尚未定义属性,则上述程式码会使用
??=
运算子来设定属性,并使用逗号运算式来避免使用以return a
结尾的大括号程式码区块。该代码的一个较不紧凑的版本是: