【问题标题】:Using underscore groupby to group an array of cars by their colour使用下划线 groupby 按颜色对汽车数组进行分组
【发布时间】:2012-07-19 21:40:56
【问题描述】:

我有一系列汽车。

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

它们每次都返回数组中的所有内容。

【问题讨论】:

  • 你说你想按品牌分组,然后在你的例子中按颜色分组?你想要哪一个?变量 redCars 还表明您实际上想要过滤列表而不是对其进行分组?
  • @Jon Taylor,关于过滤而不是分组依据,这是一个很好的观点。我已经更新了一致性问题
  • 我仍然对您的变量名 redCars 感到有些困惑,除非您打算从 grouped by 语句中选择红色汽车组?

标签: javascript iterator underscore.js


【解决方案1】:
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】:

    我从来没有使用过下划线 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" });
    

    【讨论】:

      【解决方案3】:

      您不需要false 第二个参数,以下将起作用:

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

      请注意,第二个参数可以是functionstring。如果是 string 则按该属性名称下划线分组。

      取自文档:

      将集合拆分为集合,按每个集合的运行结果分组 通过迭代器的值。如果 iterator 是字符串而不是函数, 按每个值的 iterator 命名的属性分组。

      这是working example

      【讨论】:

      • 我很困惑他想要哪个,因为他要求对品牌进行分组,但他的示例和您的答案按颜色分组。出于兴趣,我的两个答案中的第一个正确吗?如果没有,我将删除该部分。
      • @JonTaylor 你们两个都是正确的:) 关于 make 分组的好点,将更新我的答案。我也很困惑,因为 OP 要求 make 但是这些例子是按颜色的。
      • 另一件事是变量 redCars 表明他想要过滤而不是分组?除非你当然这样做? var redCars = _.groupBy(cars, 'color')["red"];或者类似的东西(我不擅长 javascript 对象)
      • 这是有效的 JS 语法。如果他想得到一种特定的颜色,那么这个例子是正确的。
      • 虽然这个答案的语法是正确的,但 redCars 变量实际上是一个包含所有颜色的对象。红色汽车可通过redCars.red 购买。
      猜你喜欢
      • 1970-01-01
      • 2022-10-07
      • 2016-10-09
      • 1970-01-01
      • 2018-11-16
      • 2019-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多