使用Undercore创建对象集合

Create collection of objects with Underscore

本文关键字:集合 创建对象 Undercore 使用      更新时间:2023-09-26

基本上,我有一个包含对象的数组,需要将它们分组在一起。这有点难以解释,但如果我给你们举个例子,可能会更容易。

结果数据

[
 {
  "Category": "Préparé",
  "Sandwich": "Martino",
  "Ingredient": "Ansjovis",
  "Price": 3.1
 },
 {
  "Category": "Préparé",
  "Sandwich": "Martino",
  "Ingredient": "Tabasco",
  "Price": 3.1
 },
 {
  "Category": "Veggie",
  "Sandwich": "Gezond",
  "Ingredient": "Tomaat",
  "Price": 2.5
 },
 {
  "Category": "Veggie",
  "Sandwich": "Gezond",
  "Ingredient": "Kaas",
  "Price": 2.5
 }
];

这是我的数组的基本示例。我不能改变这个结构,这是我们的API提供数据的方式。

我真正需要的是这种结构:

[
 {
  "CategoryName": "Prépare",
  "Sandwiches": [
    {
     "SandwichName": "Martino",
     "Price": 3.1,
     "Ingredients": ["Ansjovis", "Tabasco"]
    }
  ]
 },
 {
  "CategoryName": "Veggie",
  "Sandwiches": [
   {
    "SandwichName": "Gezond",
    "Price": 2.5,
    "Ingredients": ["Tomaat", "Kaas"]
   }
  ]
 }
]

我用Undercore和_.groupBy,_.sortBy,_.countBy试过一些东西但遗憾的是,我所尝试的一切都不起作用。这在Undercore(或其他库)中可能吗?

顺便说一句,这个例子可能有一些JSON结构错误,因为它是我自己写的。API提供的数据具有正确的格式。

这个例子只有2个三明治,但在实时情况下,我将检索多个类别,每个类别20个三明治,以此类推。这只是一个缩小的例子,但它提供了我需要什么的想法。

在简单的js 中尝试这个

var map = {};
results.forEach( function(obj){
  map[ obj.CategoryName ] = map[ obj.CategoryName ] || [];
  map[ obj.CategoryName ].push( obj );
});
var output  = Object.keys(map).map( function(key){
  var arr = [];
  map[key].forEach(function(obj){
     arr.push( {
       "SandwichName": obj.SandwichName,
       "Price": obj.Price,
       "Ingredients": obj.Ingredients
     }); 
  });
  return { "CategoryName" : key , "Sandwiches" : arr };
});

下面的代码可以帮你完成任务:

var data = [...]; // this is your json-data
var result = _.map(_.uniq(_.pluck(data, 'Category')), function(category) {
    var sandwiches = _.uniq(_.pluck(_.where(data, { Category: category }), 'Sandwich'));
    return { 
        CategoryName: category, 
        Sandwiches: _.map(sandwiches, function(sandwich) {
            return { 
            SandwitchName: sandwich, 
          Price: _.findWhere(data, { Category: category, Sandwich: sandwich }).Price, 
          Ingredients: _.pluck(_.where(data, { Category: category, Sandwich: sandwich }), 'Ingredient') 
        };
        })
  };
});