Iterate through an Array of Objects and output custom object

我是研究僧i 提交于 2019-12-11 06:10:10

问题


I am needing to build a custom object from an array of objects in Typescript.

In the giving example below, How do I count how many times the salesman_1_name is in the Array, Add the gross for each Salesman_1_name, and count if warranty is not null for each salesman_1_name? So if I have:

[
    {salesman_1_name:Brian, gross:100, warranty: Easycare},
    {salesman_1_name:Brian, gross:100, warranty: Easycare},
    {salesman_1_name:Brian, gross:100, warranty: null},
    {salesman_1_name:Kreso, gross:100, warranty: null},
    {salesman_1_name:Filip, gross:100, warranty: Easycare}
]

I would need to output:

[
    Name:Brian, Count:3, Gross:300, WarrantyCount:2, 
    Name:Kreso, Count:1, Gross:100, WarrantyCount:0, 
    Name:Filip, Count:1, Gross:100, WarrantyCount:1
]

回答1:


data.reduce((acc, cur) => {
  const obj = acc.find(x => x.Name === cur.salesman_1_name);
  if (obj) {
    obj.Gross += cur.gross;
    obj.WarrantyCount = cur.warranty !== null ? obj.WarrantyCount + 1 : obj.WarrantyCount;
  } else {
    acc.push({ Name: cur.salesman_1_name, Gross: cur.gross, WarrantyCount: cur.warranty !== null ? 1 : 0 });
  }
  return acc;
}, []);



回答2:


You could use an object as reference to the group with the name and make your aggregation.

var data = [{ salesman_1_name: 'Brian', gross: 100, warranty: 'Easycare' }, { salesman_1_name: 'Brian', gross: 100, warranty: 'Easycare' }, { salesman_1_name: 'Brian', gross: 100, warranty: null }, { salesman_1_name: 'Kreso', gross: 100, warranty: null }, { salesman_1_name: 'Filip', gross: 100, warranty: 'Easycare' }],
    grouped = [];

data.forEach(function (a) {
    if (!this[a.salesman_1_name]) {
        this[a.salesman_1_name] = { Name: a.salesman_1_name, Count: 0, Gross: 0, WarrantyCount: 0 };
        grouped.push(this[a.salesman_1_name]);
    }
    this[a.salesman_1_name].Count++;
    this[a.salesman_1_name].Gross += a.gross;
    a.warranty !== null && this[a.salesman_1_name].WarrantyCount++;    
}, Object.create(null));

console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }



回答3:


// Code goes here

var data = [{
  salesman_1_name: 'Brian',
  gross: 100,
  warranty: 'Easycare'
}, {
  salesman_1_name: 'Brian',
  gross: 100,
  warranty: 'Easycare'
}, {
  salesman_1_name: 'Brian',
  gross: 100,
  warranty: null
}, {
  salesman_1_name: 'Kreso',
  gross: 100,
  warranty: null
}, {
  salesman_1_name: 'Filip',
  gross: 100,
  warranty: 'Easycare'
}];


var result = (function(myArray) {
  var obj = []; //also can be used Object.values(dataCollector)
  var dataCollector = myArray.reduce(function(dataCollector, currentItem ) {

    if (!dataCollector[currentItem['salesman_1_name']]) {
      dataCollector[currentItem['salesman_1_name']] = {
        Name: currentItem.salesman_1_name,
        Count: 0,
        Gross: currentItem.gross,
        WarrantyCount: currentItem['salesman_1_name'].warranty != null ? 0 : 1
      };

    } else {
      dataCollector[currentItem['salesman_1_name']].Count++;
      dataCollector[currentItem['salesman_1_name']].Gross += currentItem.gross;
      if (currentItem['salesman_1_name'].warranty !== null) {
        dataCollector[currentItem['salesman_1_name']].WarrantyCount++;
      }

    }

    return dataCollector;

  }, {});

  for (var key in dataCollector) {
    if (dataCollector.hasOwnProperty(key)) {
      obj.push(dataCollector[key]);
    }
  }
  return obj;

})(data)

console.log(result);



回答4:


var rawSalesmanData = [
    { salesman_1_name: "Brian", gross: 100, warranty: "Easycare" },
    { salesman_1_name: "Brian", gross: 100, warranty: "Easycare" },
    { salesman_1_name: "Brian", gross: 100, warranty: null },
    { salesman_1_name: "Kreso", gross: 100, warranty: null },
    { salesman_1_name: "Filip", gross: 100, warranty: "Easycare" }
];

var salesmanSpecificList = rawSalesmanData.reduce(function (collector, rawDataItem/*, idx, rawDataList*/) {

    var map       = collector.map;
    var key       = rawDataItem.salesman_1_name;
    var namedItem = map[key];

    if (!namedItem) {
        namedItem = map[key] = {
            name            : key,
            occurencyCount  : 0,
            grossTotal      : 0,
            warrantyCount   : 0
        };
        collector.list.push(namedItem);
    }
    namedItem.occurencyCount++;
    namedItem.grossTotal = (namedItem.grossTotal + rawDataItem.gross);
    namedItem.warrantyCount = (namedItem.warrantyCount + ((rawDataItem.warranty !== null) ? 1 : 0));

    return collector;

}, {

    map : {},
    list: []

}).list;


console.log("salesmanSpecificList : ", salesmanSpecificList);


来源:https://stackoverflow.com/questions/39660315/iterate-through-an-array-of-objects-and-output-custom-object

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!