2

次のようなオブジェクトの配列であるデータがあります。

var cars = [ {"year": 2003, "make": "Toyota", "model": "Tercel"}
           , {"year": 2009, "make": "Toyota", "model": "Tercel"}
           , {"year": 1999, "make": "Honda", "model": "Civic"}
           , {"year": 2002, "make": "Honda", "model": "Civic"}
           , {"year": 2004, "make": "Honda", "model": "Civic"}
           , {"year": 2007, "make": "Honda", "model": "Accord"}
           ...
           ]

選択した配列が次のようになるように、各メーカーとモデルの最新のものだけを取り出したいと思います。

var selectedCars = [ {"year": 2009, "make": "Toyota", "model": "Tercel"}
                   , {"year": 2004, "make": "Honda", "model": "Civic"}
                   , {"year": 2007, "make": "Honda", "model": "Accord"}
                   ]

たとえば、次のようにフィルタリングできることを知っています。

var selectedCars = _.max(cars, function(d) { return d.year; })

しかし、それは配列全体から単一のオブジェクトを返します。また、メーカーとモデルのリストをループして、最大の年だけを選択してみましたが、うまくいきません。

selectedCars別のオプションは、make と model をキーとして d3.nest() のようなものを介してデータをネストすることですが、その後、目標に戻る方法がわかりません。

ありがとう!

4

2 に答える 2

2

Underscore の groupBy関数を調べてください。それを使用してチェーンできるはずですmap

_.map(
    _.groupBy(cars, function(car) {
        return car.make + car.model;
    }),
    function(years, makeModel) {
        return _.max(years, function(year) {
            return year.year;
        });
    }
) 

JSFiddle

于 2013-03-18T23:31:08.277 に答える
1

あなたはこのようなことをすることができます

 var cars = [ {"year": 2003, "make": "Toyota", "model": "Tercel"}
       , {"year": 2009, "make": "Toyota", "model": "Tercel"}
       , {"year": 1999, "make": "Honda", "model": "Civic"}
       , {"year": 2002, "make": "Honda", "model": "Civic"}
       , {"year": 2004, "make": "Honda", "model": "Civic"}
       , {"year": 2007, "make": "Honda", "model": "Accord"}
       ]

var carGroup = _.groupBy(cars, 'make');
for (var property in carGroup) {
if (carGroup.hasOwnProperty(property)) {
    var selectedCar = _.max(carGroup[property], function(d) { return d.year; }) 
}
alert(JSON.stringify(selectedCar));
}

http://jsfiddle.net/btevfik/BEx5a/

于 2013-03-19T00:24:05.857 に答える