Суммирование значений JSON объектов в javascript - PullRequest
1 голос
/ 11 марта 2020

У меня есть API, который возвращает такие данные:

{
        "attributes": {
            "type": "Opportunity"
        },
        "Amount": 175.36,
        "Owner": {
            "attributes": {
                "type": "User"
            },
            "Name": "Steve Knight"
        }
    },

    {
        "attributes": {
            "type": "Opportunity"
        },
        "Amount": 6800,
        "Owner": {
            "attributes": {
                "type": "User"
            },
            "Name": "Bob Smith"
        }
    }
etc...

Они представляют возможности, поэтому у каждого продавца будет несколько. Я пытаюсь вернуть объект, который суммирует суммы для каждого продавца и возвращает что-то вроде:

{Steve Knight: 5590, Bob Smith: 98722, John Jones: 12347893}

Я попытался сгруппировать объекты по имени владельца, однако я не уверен, как затем суммировать суммы

var groupBy = require('lodash.groupby');

var grouped = groupBy(data, function(x) {
        return x.Owner.Name;
      });

Ответы [ 3 ]

2 голосов
/ 11 марта 2020

Лучше всего использовать reduce метод Array.prototype

console.clear();

(function() {
  "use strict";

  function reduce(coll, elem, idx, arr) {
    coll[elem.Owner.Name] = coll[elem.Owner.Name] || 0;
    coll[elem.Owner.Name] += elem.Amount

    return coll;
  }

  const data = [
    {
      attributes: {
        type: "Opportunity"
      },
      Amount: 175.36,
      Owner: {
        attributes: {
          type: "User"
        },
        Name: "Steve Knight"
      }
    },

    {
      attributes: {
        type: "Opportunity"
      },
      Amount: 100.16,
      Owner: {
        attributes: {
          type: "User"
        },
        Name: "John Doe"
      }
    },

    {
      attributes: {
        type: "Opportunity"
      },
      Amount: 6.00,
      Owner: {
        attributes: {
          type: "User"
        },
        Name: "John Doe"
      }
    },

    {
      attributes: {
        type: "Opportunity"
      },
      Amount: 101.65,
      Owner: {
        attributes: {
          type: "User"
        },
        Name: "Steve Knight"
      }
    },

    {
      attributes: {
        type: "Opportunity"
      },
      Amount: 6800,
      Owner: {
        attributes: {
          type: "User"
        },
        Name: "Bob Smith"
      }
    }
  ];

  const reducedData = data.reduce(reduce, {})

  console.log(reducedData)
}());
1 голос
/ 11 марта 2020

Если имя ключа существует, то накапливайте уже существующее значение для нового, в противном случае просто добавьте начальное значение и имя

const arr = [{
    "attributes": {
      "type": "Opportunity"
    },
    "Amount": 175.36,
    "Owner": {
      "attributes": {
        "type": "User"
      },
      "Name": "Steve Knight"
    }
  },
  {
    "attributes": {
      "type": "Opportunity"
    },
    "Amount": 100,
    "Owner": {
      "attributes": {
        "type": "User"
      },
      "Name": "Steve Knight"
    }
  },

  {
    "attributes": {
      "type": "Opportunity"
    },
    "Amount": 6800,
    "Owner": {
      "attributes": {
        "type": "User"
      },
      "Name": "Bob Smith"
    }
  }
]


const result = arr.reduce((acc, x) => {
  const key = x.Owner.Name;
  const amount = x['Amount'];

  if (!acc[key]) {
    acc[key] = amount;
  } else {
    acc[key] = acc[key] + amount;
  }

  return acc;
}, {});
console.log(result)
0 голосов
/ 11 марта 2020

Вы можете попробовать это ниже:

let output = {}
data.map(function (item) {
    if (output.hasOwnProperty(item.Owner.Name)) {
            output[item.Owner.Name] = item.Amount;
    } else {
            output[item.Owner.Name] += item.Amount;
    }
 });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...