您可以通过将null 视为0 来省略filter(因为这是一个总和),这意味着您可以将两个maps 结合起来。另请注意,您不必将第二个参数提供给 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 是 falsyand using JavaScript's curiously powerful||operator to get"0"instead ofnullto pass intoparseInt. Of course, that will also substitute"0"@ 987654333@""(andfalseandNaNand all the other falsy values), so adjust as necessary (your original code weeded out justnullandundefinedbut leftfalse,NaN`等)。
请参阅下面的 1,了解有关 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);
使用 ES2015 及以上版本:
self.sum =
Object.keys(self.data.CallsByDisposition)
.map(k => parseInt(self.data.CallsByDisposition[k] || "0"))
.reduce((s, e) => s + e);
活生生的例子:
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,它将在 ES2017 中,今天可以填充:
self.sum =
Object.values(self.data.CallsByDisposition)
.reduce((s, e) => s + parseInt(e || "0"));
console.log("sum values: ", self.sum);
活生生的例子:
// 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);
1 使用parseInt 时,通常最好使用基数(第二个参数)。同样重要的是要记住它会很乐意忽略尾随的无效字符,例如parseInt("123abc", 10) 是 123,而不是您所期望的 NaN。
另一种方法是使用Number("123") 或+"123"(它们做同样的事情)。这样做的好处是不会忽略无效的尾随字符(Number("123abc") 是 NaN),但缺点是将 "" 视为 0。
所以你付了钱,然后你就可以选择了……