求救 javascript 的 reduce 用法問題


#1

各位大大好,
小弟有個JS的問題想要請教
目前有個需求要從array裡面的obj判斷最大值
並且回傳這個物件
例如

obj = [
  {name: 'hello', num: 50},
  {name: 'test', num: 20}
]

我用了max的function, 不過只會回傳最大的數字…請問我該如何修改才能讓他回傳
最大值的obj呢

    var max = obj.reduce(function(a, b) {
                return Math.max(a.num, b.num);
              });

#2

這類的鬼是連續 callback … 我寫一個同等的算式給你看好了,很多時候多行的 code 更能了解細節 …

var obj = [
  {name: '1', num: 50},{name: '2', num: 20},{name: '3', num: 60},
  {name: '4', num: 20},{name: '5', num: 70},{name: '6', num: 20}
]
var a = obj[0];
for(var i = 1 ; i < obj.length ; i++){
  var b = obj[i];
  if(a.num < b.num){ // Math.max 是取值,一點用都沒有,因為你最後是要物件不是?
    a = b; // 這行
    // 而非 a = b.num
  }
}
var max = a;

你的 return 基本上全等於 = 那行,但你 return 的卻是 Math.max 後的數字,而非原本的物件,因為該物件會是下一個 round 的 “a” 這個變數,然後繼續和下個物件相比較,所以把你的和我的比較應該可以看得出來才是

所以以上,你改成這樣應該就會 ok 的

var obj = [
  {name: '1', num: 50},{name: '2', num: 20},{name: '3', num: 60},
  {name: '4', num: 20},{name: '5', num: 70},{name: '6', num: 20}
];
var max = obj.reduce(function(a, b){
  console.log("test : " + a.name + " , " + b.name); //順便印出來驗證
  return a.num < b.num ? b : a;
});

/*
    [console]
    test : 1 , 2
    test : 1 , 3
    test : 3 , 4
    test : 3 , 5
    test : 5 , 6
*/

anyway functional 或一些 callback 的思維非常好理解才是,但你要知道"為何"才行


#3

可以先看一下 javascript reduce 的方式

他的概念就是丟二個參數~第一個是你要比的 function 第二個是你的初始值.
要比的 function(第一個參數是 累加值,第二個是每次回圈的值 記的 return 你的 累加值…

Functional 的點就如同 jc 大說的要記的 callback …
而他一般都是把處理的 function 丟進去…

所以 我用的方式就是宣告要比的一個 function (maxData) …再丟給他我的起始值 {}

給你參考…

ps. 多看一下官方文件都有 demo code…會很有幫助

const obj = [
  {name: 'hello', num: 50},
  {name: 'test', num: 20},
  {name: 'test', num: 30},
  {name: 'test', num: 60}
];

const maxData = function(acc, currentValue) {
  var acc = ( acc.num > currentValue.num ? acc : currentValue);
  return acc;
};


const result = obj.reduce( maxData, {});
console.log(result); // { name: 'test', num: 60 }