I have an array of cars.
car = {
make: "nissan",
model: "sunny",
colour: "red"
};
How would I use underscore.js to group the array by colour?
I've tried a few combos but I'm not really sure how to specify my iterator condition:
var carsGroupedByColor = _.groupBy(cars, false, colour);
var carsGroupedByColor = _.groupBy(vars, false, function(cars){ return cars[colour]; };
They all return everything in the array each time.
You don't need the false
second argument, the following will work:
var redCars = _.groupBy(cars, 'colour');
Note that the second parameter can either be a function
or a string
. If it's a string
Underscore groups by that property name.
Taken from the docs:
Splits a collection into sets, grouped by the result of running each value through iterator . If iterator is a string instead of a function, groups by the property named by iterator on each of the values.
Here's a working example .
I've never used underscore js but would it not be as per their docs
var groupedCars = _.groupBy(cars, function(car) { return car.make; });
In fact I believe this ir more correct since it states that if the iterator is a string instead it groups by the property in the object with that string name.
var groupedCars = _.groupBy(cars, "make");
If you then want just the red cars (even though you really should be using a filter I guess) then you can do the following
var redCars = groupedCars["red"];
To use a filter instead
Looks through each value in the list, returning an array of all the values that pass a truth test (iterator). Delegates to the native filter method, if it exists.
var redCars = _.filter(cars, function(car) { return car.colour == "red" });
var data = [
{
"name": "jim",
"color": "blue",
"age": "22"
},
{
"name": "Sam",
"color": "blue",
"age": "33"
},
{
"name": "eddie",
"color": "green",
"age": "77"
},
{
"name": "Dheeraj",
"color": "blue",
"age": "25"
},
{
"name": "Suraj",
"color": "green",
"age": "25"
}
];
var result = _.groupBy(data,"color");
console.log(result);
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.