2016-05-13 6 views
3

から最高の全体的な値を返す私は、同様の構造を持っている:配列は、最新の日付

var highestScore = Math.max.apply(Math,array.map(function(o){return o.overall;})); 

どのように私は、この配列は、取得するためにフィルタリングすることができます。これは、最も高い値を

var array = [ 
    { 
    "overall": 8, 
    "date": "2016-03-15", 
    "review": "bla bla", 
    }, 
    { 
    "overall": 6, 
    "date": "2016-01-19", 
    "review": "asfasfsadfsd", 
    }, 
    { 
    "overall": 7, 
    "date": "2016-01-23", 
    "review": "adfsasfdasfas", 
    }]; 

戻ります最新の日付からの全体的な価値の最高値に関するレビューこの場合「bla bla」

+0

私はあなたが同じ日に複数の値を持つことができると仮定して、正しいでしょうか? –

+1

この例では問題が示されます。言い換えれば、最新の日付が2つあります。 –

答えて

3

最大値のみを取得したいので、配列をソートする必要はありません。したがって、reduce()を使用し、日付文字列の比較にはDate.parse()を使用してください。

var array = [{ 
 
    "overall": 5, 
 
    "date": "2016-03-15", 
 
    "review": "sadas sasdadasdas", 
 
}, { 
 
    "overall": 6, 
 
    "date": "2016-01-19", 
 
    "review": "asfasfsadfsd", 
 
}, { 
 
    "overall": 9, 
 
    "date": "2016-03-15", 
 
    "review": "sadas sasdadasdas", 
 
}, { 
 
    "overall": 7, 
 
    "date": "2016-01-23", 
 
    "review": "adfsasfdasfas", 
 
}]; 
 

 
var res = array.reduce(function(a, b) { 
 
    // parse the date 
 
    var d1 = Date.parse(a.date), 
 
    d2 = Date.parse(b.date); 
 
    // if dates are equal compare value of overall and return value , else return based on date 
 
    return d1 == d2 ? (a.overall > b.overall ? a : b) : (d1 > d2 ? a : b); 
 
}).overall; // get overall value from final object 
 

 
document.write(res);

+1

最新の日付からの全体的な価値が最も高いので、返すものは最高の総合価値のみです。この場合、5つになるでしょう – Alex

+0

@Alex:今更新されました –

+1

日付が同じ場合に '.overall'を比較すると、日付がつながっているときに最高の' .overall'値を与えることができますか? – IrkenInvader

2

あなたは.sort()を使用することができます。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

var array = [{ 
    "overall": 5, 
    "date": "2016-03-15", 
    "review": "sadas sasdadasdas", 
}, { 
    "overall": 6, 
    "date": "2016-01-19", 
    "review": "asfasfsadfsd", 
}, { 
    "overall": 7, 
    "date": "2016-01-23", 
    "review": "adfsasfdasfas", 
}]; 
var sortedArray = array.sort(function(a, b) { 
    var aDate = Date.parse(a.date); 
    var bDate = Date.parse(b.date); 
    if (aDate > bDate) { 
    return true; 
    } else if(aDate == bDate) { 
    return a.overall > b.overall; 
    } else { 
    return false; 
    } 
}); 
//hello 
var isItMeYoureLookingFor = sortedArray[0]; 

基本的には、並べ替えの基準と、最初の1 :)を取ります。

+1

ソートされた配列は必要ありません。私は個人的に '.reduce'を使った他の答えを好みます(質問に対して技術的に正しいものに更新されていれば)。 –

+0

ソートをあまり強く避けるのはなぜですか?私はどちらか一方の方が好きです。もしこの方が読みやすいならば、ソートされた配列が後で役に立つと思うのであれば大部分のケースでパフォーマンス上の問題が起こるのではないでしょう。 – IrkenInvader

+1

'.sort'は不要です。同じ理由で、私は可能な限り '.apply'の代わりに' .call'を使います。仕事に適切なツールを使用して、あなたは知っていますか? –

1

プレーンな配列の繰り返しの使用:

function newestHighestOverall(arr){ 
    if(arr.length == 0) return 0; 

    var latestDate = new Date(arr[0].date); 
    var highestOverall = arr[0].overall; 

    for(var i=0;i<arr.length;i++){ 
    if(latestDate < new Date(arr[i].date)){ 
     highestOverall = arr[i].overall; 
     latestDate = new Date(arr[i].date); 
    }else if(latestDate == new Date(arr[i].date)){ 
     highestOverall = Math.max(highestOverall, arr[i].overall); 
    } 
    } 
    return highestOverall 
} 

console.log(newestHighestOverall(array)) 
0

あなたはsortを使用し、最初のoverallによって、その後dateによって比較し、そしてまたレビューを返すことができます。

var array = [{ 
 
    "overall": 8, 
 
    "date": "2016-03-15", 
 
    "review": "bla bla", 
 
},{ 
 
    "overall": 20, 
 
    "date": "2016-03-15", 
 
    "review": "Random bla bla", 
 
}, { 
 
    "overall": 6, 
 
    "date": "2016-01-19", 
 
    "review": "asfasfsadfsd", 
 
}, { 
 
    "overall": 7, 
 
    "date": "2016-01-23", 
 
    "review": "adfsasfdasfas", 
 
}]; 
 

 
result = array.sort((a, b) => { 
 
    return Date.parse(b.date) - Date.parse(a.date) || b.overall - a.overall; 
 
})[0].review; 
 
console.log(result)

+0

私は本当にこの答えの論理が好きですが、私はまだ '.reduce'を使う方が良いと思います。あなたがあなたの答えをhttps://jsfiddle.net/bhn14gb8/1/で更新したいのであれば、私はあなたのための模範を作った。 –

関連する問題