将对象转换为integer类型的数组并对值求和

时间:2016-09-20 16:52:40

标签: javascript jquery arrays javascript-objects

我想将JavaScript对象转换为integer类型的数组,并将所有值添加到数组中并转换回对象。

到目前为止,我尝试了以下内容:

//Convert object to array
var arr = Object.keys(some_object).map(function(k){
    return some_object[k];
})

//Remove null values
var arr_without_null = arr.filter(function(n){
    return n !=  undefined;
})

//Convert array to array of type int
var arrOfNumbers = arr_without_null.map(function(x){
    return parseInt(x);
});

//Add all the values
self.sum = arrOfNumbers.reduce(add, 0);

function add(a,b){
    return a+b;
}
console.log("sum values: ", sum);

但这看起来很丑陋,而且我想实现的目标太多了。有没有更好的方法来实现同样的目标?

注意:我不介意用jquery实现这个目标,但我更喜欢javascript。感谢

2 个答案:

答案 0 :(得分:3)

根据您的解决方案,您可以合并'几个步骤

//Convert object to array
var arr = Object.keys(self.data.CallsByDisposition).map(function(k){
    return parseInt(self.data.CallsByDisposition[k] || 0)
})

//Add all the values
self.sum = arr.reduce(add, 0);

function add(a,b){
    return a + b;
}
console.log("sum values: ", sum);

答案 1 :(得分:2)

您可以将filter视为null而忽略0(因为这是一笔款项),这意味着您可以合并两个map。另请注意,您不必为reduce提供第二个参数以获得总和;第一个电话会使用前两个条目:

self.sum =
  Object.keys(self.data.CallsByDisposition)
    .map(function(k) { return parseInt(self.data.CallsByDisposition[k] || "0"); })
    .reduce(function(s, e) { return s + e; });

我们依赖的事实null falsy and using JavaScript's curiously powerful || operator to get“0”instead of null {{1 }} parseInt函数to pass into “0”. Of course, that will also substitute “”for(and的NaN andand all the other falsy values), so adjust as necessary (your original code weeded out just未定义and假{{ 1}} NaN`等等。

请参阅下面的 1 ,了解有关but left和一般数字转换的说明。

实例:

,

使用ES2015及以上版本:

parseInt

实例:

var self = {
  data: {
    CallsByDisposition: {
      a: 7,
      b: 30,
      c: null,
      d: 5
    }
  }
};
self.sum =
  Object.keys(self.data.CallsByDisposition)
    .map(function(k) { return parseInt(self.data.CallsByDisposition[k] || "0"); })
    .reduce(function(s, e) { return s + e; });
console.log("sum values: ", self.sum);

使用self.sum = Object.keys(self.data.CallsByDisposition) .map(k => parseInt(self.data.CallsByDisposition[k] || "0")) .reduce((s, e) => s + e); ,它将出现在ES2017中并且今天可以进行填充:

let self = {
  data: {
    CallsByDisposition: {
      a: 7,
      b: 30,
      c: null,
      d: 5
    }
  }
};
self.sum =
  Object.keys(self.data.CallsByDisposition)
    .map(k => parseInt(self.data.CallsByDisposition[k] || "0"))
    .reduce((s, e) => s + e);
console.log("sum values: ", self.sum);

实例:

Object.values

1 使用self.sum = Object.values(self.data.CallsByDisposition) .reduce((s, e) => s + parseInt(e || "0")); console.log("sum values: ", self.sum); 时,通常最好使用基数(第二个参数)。同样重要的是要记住它会愉快地忽略尾随的无效字符,例如<{1}}是// Shim for Object.values const reduce = Function.bind.call(Function.call, Array.prototype.reduce); const isEnumerable = Function.bind.call(Function.call, Object.prototype.propertyIsEnumerable); const concat = Function.bind.call(Function.call, Array.prototype.concat); const keys = Reflect.ownKeys; if (!Object.values) { Object.values = function values(O) { return reduce(keys(O), (v, k) => concat(v, typeof k === 'string' && isEnumerable(O, k) ? [O[k]] : []), []); }; } // The actual code let self = { data: { CallsByDisposition: { a: 7, b: 30, c: null, d: 5 } } }; self.sum = Object.values(self.data.CallsByDisposition) .reduce((s, e) => s + parseInt(e || "0")); console.log("sum values: ", self.sum);,而不是parseInt,正如您所料。

另一种方法是使用parseInt("123abc", 10)123(执行相同的操作)。这样做的好处是不会忽略无效的尾随字符(NaNNumber("123")),但将+"123"视为Number("123abc")的缺点。

所以你付钱,然后你就可以选择......