Better way to sum a property value in an array

后端 未结 16 1454
遥遥无期
遥遥无期 2020-11-22 02:41

I have something like this:

$scope.traveler = [
            {  description: \'Senior\', Amount: 50},
            {  description: \'Senior\', Amount: 50},
             


        
相关标签:
16条回答
  • 2020-11-22 03:23

    Here is a one-liner using ES6 arrow functions.

    const sumPropertyValue = (items, prop) => items.reduce((a, b) => a + b[prop], 0);
    
    // usage:
    const cart_items = [ {quantity: 3}, {quantity: 4}, {quantity: 2} ];
    const cart_total = sumPropertyValue(cart_items, 'quantity');
    
    0 讨论(0)
  • 2020-11-22 03:25

    I thought I'd drop my two cents on this: this is one of those operations that should always be purely functional, not relying on any external variables. A few already gave a good answer, using reduce is the way to go here.

    Since most of us can already afford to use ES2015 syntax, here's my proposition:

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

    We're making it an immutable function while we're at it. What reduce is doing here is simply this: Start with a value of 0 for the accumulator, and add the value of the current looped item to it.

    Yay for functional programming and ES2015! :)

    0 讨论(0)
  • 2020-11-22 03:26

    How to sum array of object using Javascript

    const traveler = [
      {  description: 'Senior', Amount: 50},
      {  description: 'Senior', Amount: 50},
      {  description: 'Adult', Amount: 75},
      {  description: 'Child', Amount: 35},
      {  description: 'Infant', Amount: 25 }
    ];
    

    const traveler = [
        {  description: 'Senior', Amount: 50},
        {  description: 'Senior', Amount: 50},
        {  description: 'Adult', Amount: 75},
        {  description: 'Child', Amount: 35},
        {  description: 'Infant', Amount: 25 },
    ];
    function sum(arrayData, key){
       return arrayData.reduce((a,b) => {
      return {Amount : a.Amount + b.Amount}
    })
    }
    console.log(sum(traveler))
    `

    0 讨论(0)
  • 2020-11-22 03:27

    Here's a solution I find more flexible:

    function sumOfArrayWithParameter (array, parameter) {
      let sum = null;
      if (array && array.length > 0 && typeof parameter === 'string') {
        sum = 0;
        for (let e of array) if (e && e.hasOwnProperty(parameter)) sum += e[parameter];
      }
      return sum;
    }
    

    To get the sum, simply use it like that:

    let sum = sumOfArrayWithParameter(someArray, 'someProperty');
    
    0 讨论(0)
  • 2020-11-22 03:32

    Alternative for improved readability and using Map and Reduce:

    const traveler = [
        {  description: 'Senior', amount: 50 },
        {  description: 'Senior', amount: 50 },
        {  description: 'Adult', amount: 75 },
        {  description: 'Child', amount: 35 },
        {  description: 'Infant', amount: 25 },
    ];
    
    const sum = traveler
      .map(item => item.amount)
      .reduce((prev, curr) => prev + curr, 0);
    

    Re-useable function:

    const calculateSum = (obj, field) => obj
      .map(items => items.attributes[field])
      .reduce((prev, curr) => prev + curr, 0);
    
    0 讨论(0)
  • 2020-11-22 03:35

    I know that this question has an accepted answer but I thought I'd chip in with an alternative which uses array.reduce, seeing that summing an array is the canonical example for reduce:

    $scope.sum = function(items, prop){
        return items.reduce( function(a, b){
            return a + b[prop];
        }, 0);
    };
    
    $scope.travelerTotal = $scope.sum($scope.traveler, 'Amount');
    

    Fiddle

    0 讨论(0)
提交回复
热议问题