2012-10-29 39 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/

相关问题