web-dev-qa-db-ja.com

アンダースコアgroupbyを使用して、色で車の配列をグループ化する

車がたくさんあります。

car = {
    make: "nissan",
    model: "sunny",
    colour: "red"
};

Underscore.jsを使用して、配列を色別にグループ化するにはどうすればよいですか?

いくつかのコンボを試しましたが、イテレーター条件を指定する方法がよくわかりません。

var carsGroupedByColor = _.groupBy(cars, false, colour);
var carsGroupedByColor = _.groupBy(vars, false, function(cars){ return cars[colour]; };

それらはすべて、配列内のすべてを毎回返します。

15
Jon Wells

false 2番目の引数は必要ありません。次のように動作します:

var redCars = _.groupBy(cars, 'colour');

2番目のパラメーターはfunctionまたはstringのいずれかであることに注意してください。 stringの場合、アンダースコアはそのプロパティ名でグループ化されます。

ドキュメントから取られた:

コレクションをセットに分割し、各値をiteratorで実行した結果でグループ化します。 iteratorが関数ではなく文字列の場合、各値でiteratorという名前のプロパティでグループ化します。

実施例 です。

35
jabclab

アンダースコアjsを使用したことはありませんが、ドキュメントどおりではないでしょうか

var groupedCars = _.groupBy(cars, function(car) { return car.make; });

実際、イテレータが文字列の場合、代わりにその文字列名を持つオブジェクトのプロパティでグループ化されると述べているため、これはより正しいと考えています。

var groupedCars = _.groupBy(cars, "make");

その後、赤い車だけが必要な場合(本当にフィルターを使用する必要がある場合でも)、次のことができます

var redCars = groupedCars["red"];

代わりにフィルターを使用するには

リスト内の各値を調べ、真理値テスト(反復子)に合格したすべての値の配列を返します。存在する場合、ネイティブフィルターメソッドへのデリゲート。

var redCars = _.filter(cars, function(car) { return car.colour == "red" });
10
Jon Taylor
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);
2