问题
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