2016-02-29 54 views
1

如何獲取一組數字並使用JavaScript中的reduce函數返回最高和最低數字?如何獲取一組數字並使用Javascript中的reduce函數返回最高和最低數字

我迄今嘗試:

function each(collection, callback) { 
    if(Array.isArray(collection)) { 
     for(var i = 0; i < collection.length; i++) {  
      callback(collection[i]); 
    } 
    } else { 
    for(var prop in collection) { 
     callback(collection[prop]); 
    } 
} 
} 

function reduce(collection, callback, initial) { 
each(collection, function(element) { 
    if(initial === undefined) { 
     initial = element; 
    } else { 
     initial = callback(initial, element); 
    } 
}); 
return initial; 
} 

function highAndLow(collection) { 
//use reduce 
return reduce(collection, function(initial, element){ 
    if(initial[element] > initial[element]){ 
     initial = "high: " + element; 
    } else { 
     initial = "low: " + element 
    } 
    return initial; 
}, {}) 
} 

highAndLow([5,2,1,6,8]) 

結果應該是這樣的: highAndLow(5,2,1,6,8)=== {低:1,高:8}

回答

0
function highAndLow() = { 
    var args = Array.prototype.call(arguments); 
    var low = Infinity; 
    var high = -Infinity; 
    args.forEach(function (arg) { 
     if (arg < low) { 
      low = arg; 
     } 
     if (arg > high) { 
      high = arg; 
     } 
    }); 
    return { 
     low: low, 
     high: high 
    } 
} 

function highAndLow() { 
    return Array.prototype.call(arguments).reduce(function (hash, arg) { 
     hash.low = arg < hash.low ? arg : hash.low; 
     hash.high = arg > hash.high ? arg : hash.high; 
     return hash; 
    }, { 
     low: Infinity, 
     high: -Infinity 
    }); 
} 
1

是的,這是可能的,例如,此代碼

function highAndLow(array) { 
 
    return array.reduce(function (r, a) { 
 
     return { 
 
      low: Math.min(r.low, a), 
 
      high: Math.max(r.high, a) 
 
     }; 
 
    }, { low: array[0], high: array[0] }); 
 
} 
 

 
document.write('<pre>' + JSON.stringify(highAndLow([5, 2, 1, 6, 8]), 0, 4) + '</pre>'); 
 
document.write('<pre>' + JSON.stringify(highAndLow([]), 0, 4) + '</pre>'); 
 
document.write('<pre>' + JSON.stringify(highAndLow([-2, .1, 0, 1, 2]), 0, 4) + '</pre>');

0

這裏是一個解決方案:

[-30, 30, 1, 10000, -20, 50, 0].reduce(function(acc, n) { 
    if (n < acc.min) { 
     return { 
     min: n, 
     max: acc.max 
     } 
    } 
    if (n > acc.max) { 
     return { 
     min: acc.min, 
     max: n 
     } 
    } 
    return acc 
}, {min: Infinity, max: -Infinity}) 

// { 
// max: 10000, 
// min: -30 
// } 

我們提供的初始值{min: Infinity, max: -Infinity},具有min這是>=任何我們會遇到價值和max這是<=任何我們將遇到的價值。

然後我們編寫我們的reduce函數,它必須像我們的初始值那樣獲取一個值,以及數組提供的值。在我們的案例中,{min, max}Number。我們的功能簡單地將輸入數字與陣列中的maxmin值進行比較,確保我們始終返回具有相同屬性的對象maxmin

這些是任何使用reduce的基本要求。

順便說一句,我們可以採用一個非常實用和簡潔的方法與es6。

[-30, 30, 1, 10000, -20, 50, 0].reduce(({min, max}, n) => ({ 
    min: n < min ? n : min, 
    max: n > max ? n : max 
}), {min: Infinity, max: -Infinity}) 
0

對於任何數量的參數規定,則下面可以工作

function highAndLow() { 
    var inputArr = Array.prototype.slice.call(arguments); 
    return inputArr.reduce(function(res, num) { 
    if (res === null){ 
    res = {high:num,low:num}; 
    } 
    if (num > res.high) { 
     res.high = num; 
    } 
    if (num < res.low) { 
     res.low = num; 
    } 
    return res; 
    }, null); 
} 

highAndLow(5, 2, 1, 6, 8) //{high: 8, low: 1} 
相關問題