所有对象键的总和返回一个字符串,而不是预期的数字

时间:2018-03-14 23:34:01

标签: javascript node.js

我正在尝试将一个对象的所有值添加到一个变量中,但是我似乎将它们连接起来了?

binance.depth("BNBBTC", (error, depth, symbol) => {
  a = 0;
  for (value in depth.bids){
    a += value;
  };
console.log(a);
});

这是输出:

00.001081000.001080900.001080800.001080200.001080000.001079700.001079600.001079100

非常感谢任何帮助

5 个答案:

答案 0 :(得分:0)

谢谢你们

我需要先将值转换为数字

a += Number(value)

答案 1 :(得分:0)

可能会将value转换为int,例如

var v = parseInt(value);
a += value;

由于我的声誉低于50,所以无法发表评论:(。

答案 2 :(得分:0)

代码的意外行为是将StringNumber加在一起的副作用。与其他抱怨将数字添加到字符串或反之亦然的语言不同,JavaScript会隐式地将Number转换为String而不会抱怨。

这在2ality Blog Post, JavaScript quirk 1: implicit conversion of values的第2节中讨论。见下文摘录:

  

2。字符串的隐式转换

     

在Web开发中,您经常将值作为字符串实际上是数字或布尔值。例如,当用户在表单中输入此类数据时。如果您忘记显式转换这些字符串,那么JavaScript会以两种方式让您感到惊讶:首先,没有警告。其次,值会自动转换,但是会错误地转换。例如,加号运算符(+)是有问题的,因为只要其中一个操作数是字符串,它就会连接字符串。在以下与JavaScript的交互过程中,假设我们正在添加1到5.相反,我们将字符串'5'和'1'连接起来。

> var x = '5';  // wrong assumption: x is a number
> x + 1
> '51'

将转换value的解决方案合并到Number,可以在ES6的帮助下更简洁地重写上述代码。使用Array#reduce()总和可以模块化一点。我还为错误处理提供了Error-First Callbacks

const sumArray = values => values.reduce((sum, value) => (sum + Number(value)), 0)

const getDepth = (data, cb) => {      
  binance.depth(data, (err, {bids}) => {
    if (err) {
      return cb(err)
    }

    return cb(null, sumArray(Object.keys(bids)))
  })
}

getDepth('BNBBTC', (err, depth) => {
  if (err) {
    console.log(err)
  } else {
    console.log(depth)
  }
})

答案 3 :(得分:0)

尝试在添加前将值转换为数字:a + = Number(value)

答案 4 :(得分:0)

所有需要做的就是在字符串

前添加一个+

让a =" 10"

让b =" 20"

设c = + a + + b // c = 30

在你的情况下:

a + = + value