如何对 JavaScript 对象的值求和?

2022-08-30 04:57:26

我想对对象的值求和。

我习惯于python,它只是:

sample = { 'a': 1 , 'b': 2 , 'c':3 };
summed =  sum(sample.itervalues())     

以下代码有效,但它是很多代码:

function obj_values(object) {
  var results = [];
  for (var property in object)
    results.push(object[property]);
  return results;
}

function list_sum( list ){
  return list.reduce(function(previousValue, currentValue, index, array){
      return previousValue + currentValue;
  });
}

function object_values_sum( obj ){
  return list_sum(obj_values(obj));
}

var sample = { a: 1 , b: 2 , c:3 };
var summed =  list_sum(obj_values(a));
var summed =  object_values_sum(a)

我是否错过了任何明显的东西,或者这就是它的方式?


答案 1

它可以像这样简单:

const sumValues = obj => Object.values(obj).reduce((a, b) => a + b);

引用MDN:

Object.values() 方法返回给定对象自己的可枚举属性值的数组,其顺序与循环提供的顺序相同(不同之处在于 for-in 循环也枚举原型链中的属性)。for...in

来自 MdN 上的 Object.values()

reduce() 方法对累加器和数组的每个值(从左到右)应用函数,以将其减少到单个值。

来自 Array.prototype.reduce() on MDN

您可以像这样使用此功能:

sumValues({a: 4, b: 6, c: -5, d: 0}); // gives 5

请注意,此代码使用某些 ECMAScript 功能,这些功能不受某些旧版浏览器(如 IE)的支持。您可能需要使用 Babel 来编译代码。


答案 2

你可以把它们都放在一个函数中:

function sum( obj ) {
  var sum = 0;
  for( var el in obj ) {
    if( obj.hasOwnProperty( el ) ) {
      sum += parseFloat( obj[el] );
    }
  }
  return sum;
}
    
var sample = { a: 1 , b: 2 , c:3 };
var summed = sum( sample );
console.log( "sum: "+summed );


为了好玩,这里是另一个使用Object.keys()Array.reduce()的实现(浏览器支持应该不再是一个大问题):

function sum(obj) {
  return Object.keys(obj).reduce((sum,key)=>sum+parseFloat(obj[key]||0),0);
}
let sample = { a: 1 , b: 2 , c:3 };

console.log(`sum:${sum(sample)}`);

但这似乎要慢得多:jsperf.com