从对象的数组中选择特定的值在JavaScript

问题描述:

我有一个对象的一个​​这样的数组数据:从对象的数组中选择特定的值在JavaScript

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; }) 

但返回SI在整个数组之外的对象。我也尝试过循环制作和模型列表,并选择了最大年份,但我无法完成这项工作。

另一种选择是通过类似d3.nest()以make和model作为键来嵌套数据,但是我不确定如何返回到我的selectedCars目标。

谢谢!

+2

'_'是underscore.js? – 2013-03-18 23:24:15

+0

'groupBy' make。选择每个组的最大对象(通过'map')。 “映射”所需的值。 – 2013-03-18 23:26:54

检出Underscore's groupBy函数。您应该能够使用与map

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

JSFiddle

+0

很好的答案,谢谢! – potterzot 2013-03-19 00:04:10

连锁它,你可以做这样的事情

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/