2016-11-24 11 views
0

これは、Array.reduce/mapの学習目的で非常に簡単な電卓になる可能性がある、人為的な例です。混合型の配列をマップしたり減らしたりする方法

startValueオペレータタイプが混在しているアレイ(+/-のみ)を合計するにはどうすればよいですか?

私はマップし、合計を得るために減らしたい入力ストリームを持っています。意図したとおり

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

第二の減速が動作するはず:

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) 

第一減速出力が希望

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

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

答えて

-1

map意志マップいくつかの他の値に配列の各値。つまり、配列の長さ(つまり要素の数)は、mapを実行した後でも同じになります。あなたが求めていることを達成するには、filterhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter参照)を使用することができます。

だからあなたの例では、なる:

startValue.filter(combineNumbersWithOperators) 
// [123,3,4,-5,-5,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といくつかのユーティリティー機能を使用して1つの作業を行います。私の頭の上から

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

Duh!どのように私はその笑、私の悪いを逃したのですか? – Dario

関連する問題