为什么
a.push(b)
在我的 Array.reduce()? a=a.push(b)
中不起作用,其中 b
是一个字符串,将 a
转换为整数。?!
getHighestValuesInFrequency: function(frequency) {
//Input:var frequency = {mats: 1,john: 3,johan: 2,jacob: 3};
//Output should become ['John','jacob']
var objKeys = Object.keys(frequency);
var highestVal = objKeys.reduce((a,b)=>
{highestVal = (frequency[b] > a)? frequency[b] : a;
return highestVal;},0);
var winner = objKeys.reduce((a,b)=>
{ a = (frequency[b] === highestVal)? a.push(b) : a;
return a},[]);
return winner;
}
由于
push()
返回数组的新长度,因此您将长度分配给 a
。使用 if
语句代替条件运算符。
var winner = objKeys.reduce((a, b) => {
if (frequency[b] === highestVal) {
a.push(b);
}
return a;
}, []);
push() 返回新的长度。您可以使用 ES2015 扩展语法:
var Winner = objKeys.reduce((a, b)=> { a = (频率[b] ===最高值)? [...a,b]:a; 返回一个 }, []);
以@Alexander Moiseyev 的出色答案为基础。
您可以通过执行以下操作来避免设置和更改变量
a
和 winner
:
return objKeys.reduce((acc, val) =>
frequency[val] === highestVal
? [...acc, val]
: acc
,[])
注意:为了清楚起见,我已在此reduce方法中显式声明了累加器和值。
请注意,您提供的这个结构不够清晰
我会使用一个对象数组,每个对象都有一个名称和频率
var frequencies = [{name : "mats", frecuency : 1},
{name : "john", frecuency: 3},
{name : "johan", frecuency: 2},
{name : "jacob", frecuency: 3}];
然后你可以使用过滤操作和映射来得到你需要的东西
var max = Math.max.apply(Math, frequencies.map(function(o){return o.frecuency;}));
var maxElems = frequencies.filter(function(a){return a.frecuency == max}).map(function(a){return a.name;});
maxElems
会给你更高frecuency
的人的名字
扩展语法支持更短的方式:
const winner = objKeys.reduce(
(a, b) => frequency[b] === highestVal ? [...a, b] : a,
[],
)