2017-04-24 95 views
1

我的代码中的一个函数需要一个数组数组,并将这些数字的第一个数字以及它们在数组中出现的次数放入映射中。因此,例如,对于Javascript:使用reduce()将频率转换为百分比?

[1539, 1390, 1023, 2642, 3912, 7419, 7129, 9520, 2239] 

数组中生成的地图将

{"1" => 3, "2" => 2, "3" => 1, "7" => 2, "9" => 1} 

现在我工作的功能,我必须得接受一个生成的地图并将其转换为一个地图百分比。但是,我必须使用只有的reduce()和map()函数。到目前为止,我只知道如何实际计算物理频率,但我不知道如何使用reduce()将它们全部转换为百分比。这是到目前为止我的代码:

function toPercentages(benfordMap) { 
    let keys = [ ...benfordMap.keys()]; 
    let values = [ ...benfordMap.values()]; 

values.reduce(
    (acc, currVal) => { 
    // do something 
    }) 

    return values; 
} 

我做什么,我觉得我可以用我用来计算频率的代码一般的想法,但我不知道如何整合语法。我的频率代码如下所示:

function freqs(items) { 
var Frequencies = new Map(); 
items.reduce(
    (acc, currVal) => (
     acc[currVal] = ++acc[currVal] || 1, acc 
    ), 
    {} 
); 

for (var x in items){ 
    Frequencies.set(x, items[x]); 
} 

return Frequencies; 
} 

我过于新的JavaScript,所以我不知道确切位置在减少()函数,我想补充的百分比计算的代码。任何人都可以将我指向正确的方向吗?

+0

你不会把百分比计算代码在'。降低() '回调。你可以用'.reduce()'将计数累加到一个10位数(10位数)中,然后使用'.map()'将它变成一个百分比数组,然后使用'.reduce )'再次把它变成一个物体。 – Pointy

回答

3

我不知道,我的理解对不对,但无论如何,检查下面的代码:

var obj = {"1": 3, "2": 2, "3": 1, "7": 2, "9": 1} 
 

 
function toPercentages(obj){ 
 
    let m = new Map() 
 
    const sum = Object.keys(obj).reduce((acum, item) => { 
 
     return acum + obj[item]; 
 
    }, 0); 
 
    
 
    Object.keys(obj).map(key => { 
 
    m.set(key, ((obj[key]/sum) * 100).toFixed(2));  
 
    }) 
 
    
 
    return m; 
 
} 
 

 
toPercentages(obj);

+0

这将返回我的控制台中的[对象,对象,对象,对象,对象],你是否需要对我的问题进行澄清? –

+0

更改数组映射结构 –

+0

谢谢,我基本上用你的代码作为框架。帮助指引我朝着正确的方向发展。 –