118

オブジェクトの値を合計したいと思います。

私は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)

明らかな何かが欠けていますか、それともこれがそのままですか?

4

15 に答える 15

134

それはそれと同じくらい簡単です:

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

MDN の引用:

このObject.values()メソッドは、指定されたオブジェクト自体の列挙可能なプロパティ値の配列を、for...inループによって提供される順序と同じ順序で返します (for-in ループは、プロトタイプ チェーン内のプロパティも列挙するという違いがあります)。

MDNからObject.values()

このreduce()メソッドは、アキュムレータと配列の各値 (左から右) に対して関数を適用して、単一の値に減らします。

MDNからArray.prototype.reduce()

この関数は次のように使用できます。

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

このコードは、一部の古いブラウザー (IE など) ではサポートされていない ECMAScript 機能を使用していることに注意してください。コードをコンパイルするには、 Babelを使用する必要がある場合があります。

于 2016-08-19T19:23:39.093 に答える
92

すべてを 1 つの関数にまとめることができます。

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 );


楽しみのために、and を使用した別の実装を次に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

于 2013-05-08T20:10:34.907 に答える
24

通常のforループは非常に簡潔です。

var total = 0;

for (var property in object) {
    total += object[property];
}

object.hasOwnPropertyプロトタイプを変更した場合は、追加する必要がある場合があります。

于 2013-05-08T20:09:58.237 に答える
15

正直なところ、私たちの「現代」を考えると、次のように、可能な限り関数型プログラミングのアプローチを採用します。

const sumValues = (obj) => Object.keys(obj).reduce((acc, value) => acc + obj[value], 0);

accumulatoraccは、値 0 から始まり、オブジェクトのすべてのループ値を累積しています。これには、内部変数または外部変数に依存しないという追加の利点があります。これは定数関数なので、誤って上書きされることはありません... ES2015 に勝ちましょう!

于 2016-06-15T20:50:01.407 に答える
12

for...in単純なループを使用していない理由はありますか?

var sample = { a: 1 , b: 2 , c:3 };
var summed = 0;

for (var key in sample) {
    summed += sample[key];
};

http://jsfiddle.net/vZhXs/

于 2013-05-08T20:10:03.617 に答える
1

ロダッシュを使う

 import _ from 'Lodash';
 
 var object_array = [{a: 1, b: 2, c: 3}, {a: 4, b: 5, c: 6}];
 
 return _.sumBy(object_array, 'c')
 
 // return => 9

于 2019-09-07T20:31:08.003 に答える