2012-10-29 78 views
0

如何總結這樣的陣列 [ '', '4490449', '2478', '1280990', '22296892', '244676', '1249', '13089', '0', '0', '0\n' ] 如何總結一個字符串數組,代表整數

如果我把類似的東西['','4490449', ... , '0\n' ].reduce(function(t,s){ return t+s)該陣列上的刺結合,而不是相加。

我已經嘗試了一些鑄造用parseInt()但這會導致NaN :)

+0

'「」'並沒有真正的代表一個整數;你如何期待它被處理? – ruakh

+0

我的意思是''可以代表零或? – zzeroo

回答

5

你需要確保你所求和的值是整數。這裏是一個可能的解決方案:

var ary=[ '', '4490449', '2478', '1280990', '22296892', 
      '244676', '1249', '13089', '0', '0', '0\n' ]; 

console.log(
    ary 
    .map(function(elt){ // assure the value can be converted into an integer 
     return /^\d+$/.test(elt) ? parseInt(elt) : 0; 
    }) 
    .reduce(function(a,b){ // sum all resulting numbers 
     return a+b 
    }) 
)​; 

其打印「28329823」到控制檯。

http://jsfiddle.net/hF6xv/

+0

我認爲你應該從該正則表達式中刪除'$'; 'parseInt'忽略後面的非數字(例如''32a''變成'32'),OP的例子包含「0 \ n''作爲一個元素。 (當然,你的版本會將'0 \ n''轉換爲'0',但這主要是巧合。) – ruakh

+0

雖然你說的是真的,但我相信期望的是字符串應該表示數字整數值,其中'0 \ n'沒有。 –

0

你有你的數組中的某些值不是整數。讓我們假設他們都是,那麼你可以這樣做:

['4490449', '2478', '1280990', '22296892', '244676', '1249', '13089'].reduce( 
    function(t, s) { 
     return parseInt(t) + parseInt(s); 
    } 
); 
+0

這不是我在 之前試過的東西[''','4490449','2478','1280990','22296892','244676','1249','13089','0',' 0','0 \ n'] .reduce( ... function(t,s){ ..... return parseInt(t)+ parseInt(s); .....} .. 。); NaN ''' – zzeroo

+0

在代碼之前閱讀:「您的數組中有一些不是整數的值。 ''''不是一個整數,'0 \ n''也不是。 –

+0

是的,但這是跳躍點:)謝謝 – zzeroo

1

見搗鼓這似乎是確定的工作:

var arry = [ 'asdf', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'ham10am' ]; 

var res = arry.reduce(function(prev, curr){ 
    return (Number(prev) || 0) + (Number(curr) || 0); 
}); 

console.log(res); // prints 45 
+0

這也允許加入小數。 – Shmiddty

1

試試這個:

var sum = 0, 
    arr = [ '', '1', '2', '3.0','4\n', '0x10' ], 
    i = arr.length; 

while(i--) { 
    // include radix otherwise last element gets interpreted as 16 
    sum += parseInt(arr[i], 10) || 0; 
} 

console.log(sum) // sum => 10 as 3.0 and 4\n were successfully parsed 

小提琴here

1

你在使用parseInt函數正確的。

但是您需要將它用於每個reduce參數。

此外,您還需要檢查每個parseInt的結果是否是一個數字,因爲如果不是,函數將嘗試用NaN求和一個數字,其他所有和數將最終成爲NaN。

Mozilla公司的EcmaScript documentation on parseInt說:

如果第一個字符不能被轉換成數字,parseInt函數 返回NaN。

然後,爲了避免讓NaN的破壞你的目標,你可以實現這樣的:

function parseIntForSum(str) { 
    var possibleInteger = parseInt(str); 
    return isNaN(possibleInteger) ? 0 : possibleInteger; 
} 

function sum(f, s) { 
    return parseIntForSum(f) + parseIntForSum(s); 
} 

window.alert('sum = ' + [ '', '4490449', '2478', '1280990', '22296892', '244676', '1249', '13089', '0', '0', '0\n' ].reduce(sum)​​​);​ 

下面是與它的jsfiddle工作:http://jsfiddle.net/cLA7c/

相關問題