json JS -使用reduce创建数组中存在的百分比

a1o7rhls  于 2022-12-15  发布在  其他
关注(0)|答案(2)|浏览(151)

我尝试使用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”?谢谢

iq0todco

iq0todco1#

首先,你的代码会产生一个空数组(带有一些额外的属性),因为x在你的例子中是一个国家的快捷方式,而不是一个索引,所以如果你使用pcts[x] = ..,你实际上是在使用pcts['us'] = ...,这在大多数情况下对数组来说没有太大的意义。
第二,如果你想在数组中有一个复杂的对象,你需要在某个地方创建它......例如,看下面的代码片段
1.我定义了reduce以返回object,因此可以很容易地检查当前国家(由x定义)是否已经包含。
1.如果没有包含它,我就向对象添加一个新属性,该对象已经包含了结果中所需的所有属性(即{ country: x, percentage: 0}
1.现在,我已经确定了当前国家的对象存在,我可以通过它的名称访问它并更新百分比。您需要50还是0.5由您决定。

  1. reduce现在返回一个对象,如
{
   "us": { country: "us", percentage: 0.5},
   "it": { country: "it", percentage: 0.33} 
   ...
 }

因此,要获取值的数组,只需使用Object.values(...),它将对象的所有可枚举属性作为数组返回

const 
  countriesList = ["US","US","US","UK","IT","IT"];
  

const 
  weightPercCountries = Object.values(countriesList.reduce((pcts, x) => {
    if (!(x in pcts))
      pcts[x] = { country: x, percentage: 0}
    
    pcts[x].percentage += (1 / countriesList.length);
    return pcts;
}, {}));

console.log(weightPercCountries)

当然,您可以缩短reduce的回调(例如Andrew Park的回答)。但是为了可读性(特别是对于初学者),我决定使用更显式的代码...

2ic8powd

2ic8powd2#

const countriesList = ["US","US","US","UK","IT","IT"]

const r = Object.values(countriesList.reduce((a,c,_,r)=>
  ((a[c]??={'country':c, weight:0}).weight+=1/r.length,a),{}))

console.log(r)

如果尚未定义属性,则上述程式码会使用??=运算子来设定属性,并使用逗号运算式来避免使用以return a结尾的大括号程式码区块。
该代码的一个较不紧凑的版本是:

const countriesList = ["US","US","US","UK","IT","IT"]

const m = countriesList.reduce((a,c,_,r)=> {
  if (!a[c]) a[c] = {'country': c, weight: 0}
  a[c].weight += 1 / r.length
  return a
}, {})

// produces:
// {
//   US: { country: 'US', weight: 0.5 },
//   UK: { country: 'UK', weight: 0.16666666666666666 },
//   IT: { country: 'IT', weight: 0.3333333333333333 }
// }

// now take just the object values, and not the keys
const r = Object.values(m)

console.log(r)

相关问题