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

Мне нужно построить пользовательский объект из массива объектов в Typescript.

В приведенном ниже примере как подсчитать, сколько раз имя продавца_1_ входит в массив, добавить брутто для каждого имени продавца_1 и подсчитать, если гарантия не равна нулю для каждого имени продавца_1? Так что если у меня есть:

[
    {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}
]

Я должен был бы вывести:

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

4 ответа

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;
}, []);

Вы можете использовать объект в качестве ссылки на группу с именем и произвести агрегацию.

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

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

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

Другие вопросы по тегам