2

I want to get the sum of all menge keys in my js object and store it inside a variable. Can someone help me out on how to do this? Snippet of my object:

var obj = {
  "_15800175": {
    "posID": "159469",
    "scanID": "22597",
    "anr": "15800175",
    "TVanr": "",
    "code": "G-09-27-2E",
    "ean": "4710069680575",
    "marke": "fox",
    "bez": "jersey yellow",
    "bez2": "size xl",
    "menge": "1",
    "ve": "St\u00fcck",
    "Dimensionstext": "TT9857BG\r\n",
    "Langtext": ""
  },
  "_15100027": {
    "posID": "159471",
    "scanID": "22597",
    "anr": "15100027",
    "TVanr": "",
    "code": "G-11-03-2A",
    "ean": "4712511825411",
    "marke": "fox",
    "bez2": "jersey L",
    "menge": "1",
    "ve": "St\u00fcck",
    "Dimensionstext": "blue\r\n",
    "Langtext": ""
  }
}
VLAZ
  • 26,331
  • 9
  • 49
  • 67
blue
  • 49
  • 7
  • Possible duplicate of [Better way to sum a property value in an array](https://stackoverflow.com/questions/23247859/better-way-to-sum-a-property-value-in-an-array) – Heretic Monkey Sep 12 '19 at 12:06

5 Answers5

4

You can use Object.values() and Array.reduce() like following:

var obj = {
  "_15800175": {
    "posID": "159469",
    "scanID": "22597",
    "anr": "15800175",
    "TVanr": "",
    "code": "G-09-27-2E",
    "ean": "4710069680575",
    "marke": "fox",
    "bez": "jersey yellow",
    "bez2": "size xl",
    "menge": "1",
    "ve": "St\u00fcck",
    "Dimensionstext": "TT9857BG\r\n",
    "Langtext": ""
  },
  "_15100027": {
    "posID": "159471",
    "scanID": "22597",
    "anr": "15100027",
    "TVanr": "",
    "code": "G-11-03-2A",
    "ean": "4712511825411",
    "marke": "fox",
    "bez2": "jersey L",
    "menge": "1",
    "ve": "St\u00fcck",
    "Dimensionstext": "blue\r\n",
    "Langtext": ""
  },
  "dummy": {
    "menge": "not-convertable-to-integer"
  },
   "dummy2": {
    // This item does NOT have "menge" property
  }
}

var sumMenge = Object.values(obj).reduce((sum, item) => sum + (!isNaN(+item.menge) || 0),0);
//                                                                    ^^^ This is to convert item.menge to number

console.log(sumMenge);

Hope this helps

Harun Yilmaz
  • 8,281
  • 3
  • 24
  • 35
1

What you can do is iterate on the keys of the main object and then reduce it to the sum ie: Object.keys(obj).reduce((acc, key) => acc = obj[key].menge + acc, 0)

CharybdeBE
  • 1,791
  • 1
  • 20
  • 35
  • I think you should swap `key, acc` arguments as the first argument of `reduce` is accumulator. And `menge` is string so you need to convert it to number first. – Harun Yilmaz Sep 12 '19 at 12:01
0

Use .reduce() after getting the keys array

var obj = {
      "_15800175": {
          "posID": "159469",
          "scanID": "22597",
          "anr": "15800175",
          "TVanr": "",
          "code": "G-09-27-2E",
          "ean": "4710069680575",
          "marke": "fox",
          "bez": "jersey yellow",
          "bez2": "size xl",
          "menge": "1",
          "ve": "St\u00fcck",
          "Dimensionstext": "TT9857BG\r\n",
          "Langtext": ""
      },
      "_15100027": {
          "posID": "159471",
          "scanID": "22597",
          "anr": "15100027",
          "TVanr": "",
          "code": "G-11-03-2A",
          "ean": "4712511825411",
          "marke": "fox",
          "bez2": "jersey L",
          "menge": "1",
          "ve": "St\u00fcck",
          "Dimensionstext": "blue\r\n",
          "Langtext": ""
      }
  }

  var menge_sum = Object.keys(obj).reduce(function(old, cur) {
      old += Number(obj[cur]['menge'])
      return old
  }, 0);
  console.log(menge_sum)
Janie
  • 638
  • 9
  • 26
0

You need to get the object keys into a array.

var id=Object.keys(obj); //get all keys
var menge=0;// init...
for (i=0;i<id.length;i++){// run over all keys found
  menge=menge+obj[id[i]].menge; /add the things
}
console.log(menge);//see result

see Object.keys

Thomas Ludewig
  • 696
  • 9
  • 17
0

You can iterate through object's properties names using for (prop in obj). Then you can simply use total += +obj[prop].menge || 0;. Here +obj[prop].menge will convert into number. +obj[prop].menge || 0; this line will be return 0 if object does not contain menge property.

var obj = {
  "_15800175": {
    "posID": "159469",
    "scanID": "22597",
    "anr": "15800175",
    "TVanr": "",
    "code": "G-09-27-2E",
    "ean": "4710069680575",
    "marke": "fox",
    "bez": "jersey yellow",
    "bez2": "size xl",
    "menge": "1",
    "ve": "St\u00fcck",
    "Dimensionstext": "TT9857BG\r\n",
    "Langtext": ""
  },
  "_15100027": {
    "posID": "159471",
    "scanID": "22597",
    "anr": "15100027",
    "TVanr": "",
    "code": "G-11-03-2A",
    "ean": "4712511825411",
    "marke": "fox",
    "bez2": "jersey L",
    "menge": "1",
    "ve": "St\u00fcck",
    "Dimensionstext": "blue\r\n",
    "Langtext": ""
  }
}

let total = 0;
for (prop in obj) { 
  total += +obj[prop].menge || 0;
}

console.log(total);
Karan
  • 12,059
  • 3
  • 24
  • 40