2016-11-24 23 views
0

這是一個人爲的例子,它可能是一個非常簡單的計算器,用於Array.reduce/map的學習目的。如何映射/減少混合類型的數組並將它們彙總在一起

我該如何計算startValue數組與混合運算符類型(只有+/-)?

我有一個輸入流,我想映射,然後減少以獲得總和。

const sum = (p,c) => { 
    return p + c; 
}; 

let startValue = [1,2,3,'+',3,'+',4,'-',5,'+','-',5,3]; 
const finalValue = startValue 
     .map(combineNumbersWithOperators) //or reduce 
     .reduce(sum) 

第一減速器將輸出:

startValue.map(combineNumbersWithOperators) 
// [123,3,4,-5,-53] 

如預期的第二減速器應該工作:

[123,3,4,-5,-53].reduce(sum) 
// = 123 
+0

'..... '+', ' - ',5,3]'==>'3' ????? –

回答

0

它看起來像你的第一個例子是不是與你的意圖簽署公約是一致的。數組中的最後一個5,3應該根據您在數組第一部分組合1,2,3的方式解析爲53。此外,我忽略了您陣列中的孤立-登錄,因爲它不清楚/無法解釋。

此解決方案僅使用.reduce();我不認爲地圖或過濾是必要的。

var flat = startValue.reduce(function(a,b) { 
    if (b.toString() === '-') { 
    var arr = a.toString().split('%'); 
    arr[arr.length - 1] = '-' + arr[arr.length-1]; 
    return arr.join('%') + '%'; 
    } else if (b.toString() === '+') { 
    return a.toString() + '%'; 
    } 
    return a.toString() + b.toString(); 
}).split('%').reduce(function(a,b){ 
    if (b === '-') { 
    return a; 
    } 
    return a + parseInt(b); 
    },0) 
0

我會一口氣使用forEach和幾個實用功能。

從我的頭頂:

const array = [1,2,3,'+',3,'+',4,'-',5,'+','-',5,3]; 
let result = 0; /* the final result */ 
let numberAggregator = ''; /* used to aggregate the numbers */ 
let operator = '+'; /* last operator found, start by adding the first number */ 

const parseAggregator = function(aggregator) { 
    let number = parseFloat(aggregator); 
    if (isNaN(number)) { 
     number = 0; 
    } 
    return number; 
}; 

const performOperation = (left, right, operator) => { 
    /* perform the lat operator's function */ 
    switch (operator) { 
     case '+': 
      return left + right; 

     case '-': 
      return left - right; 

     default: 
      /* you could add other operators here */ 
      return left; /* silently fail for unsupported operators :(*/ 
    } 
}; 

array.forEach(input => { 
    if (isNaN(parseInt(input, 10)) && input !== '.') { /* it's an operator */ 
     /* parse the last aggregated number */ 
     const lastNumber = parseAggregator(numberAggregator); 
     numberAggregator = ''; 

     /* perform the operation */ 
     result = performOperation(result, lastNumber, operator); 

     /* save the new operator */ 
     operator = input; 
    } else { 
     /* add the input to the number aggregator */ 
     numberAggregator += input; 
    } 
}); 

/* once you get to the end, perform the last operation cached */ 
const lastNumber = parseFloat(numberAggregator); 
result = performOperation(result, parseAggregator(numberAggregator), operator); 

console.log(result); /* 123 + 3 + 4 - 5 - 53 = 72 */ 
+0

OP要求爲Array.reduce/map的學習目的設計一個實例。 –

+0

呃!我怎麼會錯過那個大聲笑,我的壞話 – Dario

相關問題