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 winer = objKeys.reduce((a、b)=> { a =(frequency [b] === highestVal)?[... a、b ]:a; return a }、[]);
@AlexanderMoiseyevによる優れた回答に基づいています。
次の手順を実行することで、変数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
が高い人の名前を表示します