push() 在reduce() 中无法按预期工作

问题描述 投票:0回答:5

为什么

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;  
 }                                  
javascript arrays reduce
5个回答
28
投票

由于

push()
返回数组的新长度,因此您将长度分配给
a
。使用
if
语句代替条件运算符。

var winner = objKeys.reduce((a, b) => {
    if (frequency[b] === highestVal) {
        a.push(b);
    }
    return a;
}, []);

10
投票

push() 返回新的长度。您可以使用 ES2015 扩展语法:


var Winner = objKeys.reduce((a, b)=> {
    a = (频率[b] ===最高值)? [...a,b]:a;
    返回一个
}, []);


2
投票

以@Alexander Moiseyev 的出色答案为基础。

您可以通过执行以下操作来避免设置和更改变量

a
winner

return objKeys.reduce((acc, val) =>
    frequency[val] === highestVal 
      ? [...acc, val] 
      : acc
,[])

注意:为了清楚起见,我已在此reduce方法中显式声明了累加器和值。


1
投票

请注意,您提供的这个结构不够清晰

我会使用一个对象数组,每个对象都有一个名称和频率

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

的人的名字

1
投票

扩展语法支持更短的方式:

const winner = objKeys.reduce(
  (a, b) => frequency[b] === highestVal ? [...a, b] : a,
  [],
)
© www.soinside.com 2019 - 2024. All rights reserved.