我想将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。感谢
答案 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 and
空and 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
(执行相同的操作)。这样做的好处是不会忽略无效的尾随字符(NaN
是Number("123")
),但将+"123"
视为Number("123abc")
的缺点。
所以你付钱,然后你就可以选择......