Grouping An Array And Counting Items Creating New Array Based On Groups
Solution 1:
With proper data, you could iterate the array of objects and count the regions.
var dataResult = [{ region: "Africa", fruit: "Orange", user: "Gary" }, { region: "Africa", fruit: "Apple", user: "Steve" }, { region: "Europe", fruit: "Orange", user: "John" }, { region: "Europe", fruit: "Apple", user: "bob" }, { region: "Asia", fruit: "Orange", user: "Ian" }, { region: "Asia", fruit: "Apple", user: "Angelo" }, { region: "Africa", fruit: "Orange", user: "Gary" }],
grouped = [];
dataResult.forEach(function (a) {
if (!this[a.region]) {
this[a.region] = { region: a.region, count: 0 };
grouped.push(this[a.region]);
}
this[a.region].count++;
}, Object.create(null));
console.log(grouped);
.as-console-wrapper { max-height: 100%!important; top: 0; }
For unique user, you might use an extended hash table
var dataResult = [{ region: "Africa", fruit: "Orange", user: "Gary" }, { region: "Africa", fruit: "Apple", user: "Steve" }, { region: "Europe", fruit: "Orange", user: "John" }, { region: "Europe", fruit: "Apple", user: "bob" }, { region: "Asia", fruit: "Orange", user: "Ian" }, { region: "Asia", fruit: "Apple", user: "Angelo" }, { region: "Africa", fruit: "Orange", user: "Gary" }],
grouped = [];
dataResult.forEach(function (a) {
var key = [a.region, a.user].join('|');
if (!this[a.region]) {
this[a.region] = { region: a.region, count: 0 };
grouped.push(this[a.region]);
}
if (!this[key]) {
this[key] = true;
this[a.region].count++;
}
}, Object.create(null));
console.log(grouped);
.as-console-wrapper { max-height: 100%!important; top: 0; }
Part with a decent look at the hash table and some explanations in the code.
var dataResult = [{ region: "Africa", fruit: "Orange", user: "Gary" }, { region: "Africa", fruit: "Apple", user: "Steve" }, { region: "Europe", fruit: "Orange", user: "John" }, { region: "Europe", fruit: "Apple", user: "bob" }, { region: "Asia", fruit: "Orange", user: "Ian" }, { region: "Asia", fruit: "Apple", user: "Angelo" }, { region: "Africa", fruit: "Orange", user: "Gary" }],
grouped = [], // result array
hash = Object.create(null); // oposite of {}, this object does not contain any prototypes
dataResult.forEach(function (a) {
// build key with region + name, spot pipe in hashvar key = [a.region, a.user].join('|');
// check if region is not in hash tableif (!this[a.region]) {
// create new object with region and count and insert it into hash tablethis[a.region] = { region: a.region, count: 0 };
// push the object to the result
grouped.push(this[a.region]);
}
// check if if not region and user exists, it means// the user in the region is not counted yet.if (!this[key]) {
//create hash entrythis[key] = true;
// increment count this[a.region].count++;
}
}, hash);
console.log(hash);
console.log(grouped);
.as-console-wrapper { max-height: 100%!important; top: 0; }
Solution 2:
What you want to do is turn your array into an object because your final array is not a valid array.
So you want to return something that looks like this.
newResults= {Africa:2, Europe:2, Asia:2}
You would need to right a function that iterates through the array and returns a new object with the desired key and value pairs. Take a look at the map and reduce functions in Javascript, they may be some help.
Reduce https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
Map https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map
Post a Comment for "Grouping An Array And Counting Items Creating New Array Based On Groups"