web-dev-qa-db-ja.com

push()はreduce()で期待どおりに機能しません

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;  
 }                                  
14

Push()は配列の新しい長さを返すため、長さをaに割り当てます。条件演算子の代わりに、ifステートメントを使用してください。

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

Push()は新しい長さを返します。 ES2015スプレッド構文を使用できます。

 
 var winer = objKeys.reduce((a、b)=> {
 a =(frequency [b] === highestVal)?[... a、b ]:a; 
 return a 
}、[]); 
 
7

@AlexanderMoiseyevによる優れた回答に基づいています。

次の手順を実行することで、変数awinnerの両方の設定と変更を回避できます。

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

注:わかりやすくするために、このreduceメソッドでアキュムレータと値を明示的に宣言しました。

1
alexi2

あなたが提供するこの構造は十分に明確ではないことに注意してください

代わりに、それぞれに名前と頻度を持つオブジェクトの配列を使用します

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
Daniel Rosano