2016-02-05 90 views
0

我的数据,我从REST API获取我想要创建一个使用$http阵列转型与angular.forEach - AngularJS

orderItem: { 
    id: 159 
    name: Empanadas (Choice of 2) 
    description: Choice of Diced Beef; Spinach, Stilton and Onion; or Smoked Ham and Mozzarella 
    price: 700 
    available: 1 
    created_at: 2016-01-31 16:50:31 
    updated_at: 2016-01-31 16:50:31 
    menu_category_id: 41 
    restaurant_id: 11 
    menu_modifier_groups: 
     [ { 
      id: 9 
      name: Choose 2 Empanadas 
      instruction: null 
      min_selection_points: 2 
      max_selection_points: 2 
      force_selection: 1 
      created_at: 2016-02-01 01:03:35 
      updated_at: 2016-02-01 01:12:23 
      menu_item_id: 159 
      restaurant_id: 11 
       menu_modifier_items: 
       [ { 
        id: 34 
        name: Diced Beef 
        price: 0 
        created_at: 2016-02-01 01:04:08 
        updated_at: 2016-02-01 01:04:08 
        menu_modifier_group_id: 9 
        restaurant_id: 11 
        menu_item_id: 159 
        selected: true 
       } , { 
        id: 35 
        name: Smoked Salmon & Mozzarella 
        price: 0 
        created_at: 2016-02-01 01:04:37 
        updated_at: 2016-02-01 01:04:37 
        menu_modifier_group_id: 9 
        restaurant_id: 11 
        menu_item_id: 159 
        selected: true 
       } , { 
        id: 36 
        name: Stilton, Spinach and Onion 
        price: 0 
        created_at: 2016-02-01 01:05:05 
        updated_at: 2016-02-01 01:05:05 
        menu_modifier_group_id: 9 
        restaurant_id: 11 
        menu_item_id: 159 
        selected: false 
      } ] 
     } ] 
} 

,你可以使用Angular传递回我API前新object看到我有orderItem其中包含几个menu_modifier_groups然后包含几个menu_modifier_items

我想要做的就是将该数据转换;

cartItemcartModifierItems

cartItem将是:

id: 159 
name: Empanadas (Choice of 2) 
description: Choice of Diced Beef; Spinach, Stilton and Onion; or Smoked Ham and Mozzarella 
price: 700 
available: 1 
created_at: 2016-01-31 16:50:31 
updated_at: 2016-01-31 16:50:31 
menu_category_id: 41 
restaurant_id: 11 
cartModifierItems: // an array containing all menu_modifier_items from all the menu_modifier_groups where selected = true 

然后cartModifierItems将会从所有menu_modifier_groups其中selected: true这样我留下了cartItemcartItem.cartModifierItems

任何所有menu_modifier_items帮助或指导表示赞赏。

+0

您是否需要一个具有cartModifierItems属性的cartItem对象? –

+0

@ Klaster_1是'cartItem',内部''数组',名为'cartModifierItems',包含所有'menu_modifier_groups'中的所有'menu_modifier_items',其中'selected = true' –

回答

0

这里接受OrderItem的输出cartItem功能:

function makeCartItem(orderItem) { 
    var cartItem = angular.copy(orderItem) 
    delete cartItem.menu_modifier_groups 
    cartItem.cartModifierItems = orderItem.menu_modifier_groups.reduce(function(acc, menuModifierGroup) { 
     const selectedItems = menuModifierGroup.menu_modifier_items.filter(function(item) { 
      return item.selected 
     }) 
     return acc.concat(selectedItems) 
    }, []) 
    return cartItem 
} 

// { 
// "id": 159, 
// "name": "Empanadas (Choice of 2)", 
// "description": "Choice of Diced Beef; Spinach, Stilton and Onion; or Smoked Ham and Mozzarella", 
// "price": 700, 
// "available": 1, 
// "created_at": "2016-01-31 16:50:31", 
// "updated_at": "2016-01-31 16:50:31", 
// "menu_category_id": 41, 
// "restaurant_id": 11, 
// "cartModifierItems": [ 
//  { 
//   "id": 34, 
//   "name": "Diced Beef", 
//   "price": 0, 
//   "created_at": "2016-02-01 01:04:08", 
//   "updated_at": "2016-02-01 01:04:08", 
//   "menu_modifier_group_id": 9, 
//   "restaurant_id": 11, 
//   "menu_item_id": 159, 
//   "selected": true 
//  }, 
//  { 
//   "id": 35, 
//   "name": "Smoked Salmon & Mozzarella", 
//   "price": 0, 
//   "created_at": "2016-02-01 01:04:37", 
//   "updated_at": "2016-02-01 01:04:37", 
//   "menu_modifier_group_id": 9, 
//   "restaurant_id": 11, 
//   "menu_item_id": 159, 
//   "selected": true 
//  } 
// ] 
// } 

你的问题是不是真正的角,但更多的在JavaScript中的数据转换。看看我用达到的效果的方法和功能:

  1. angular.copy。创建深层对象副本。与delete结合本人提出了一个新orderItem衍生副本而不menu_modifier_groups

    var cartItem = angular.copy(orderItem) 
    delete cartItem.menu_modifier_groups 
    
{ 
    "id": 159, 
    "name": "Empanadas (Choice of 2)", 
    "description": "Choice of Diced Beef; Spinach, Stilton and Onion; or Smoked Ham and Mozzarella", 
    "price": 700, 
    "available": 1, 
    "created_at": "2016-01-31 16:50:31", 
    "updated_at": "2016-01-31 16:50:31", 
    "menu_category_id": 41, 
    "restaurant_id": 11 
} 
  • Array.prototype.reduce。在menu_modifier_groups上调用时,它会将每个值累加到作为第一个参数传递的函数返回的新数组(第二个参数)中。

  • Array.prototype.filter。通过传递给它的函数来过滤menu_modifier_items。如果任何遍历的物品具有真实性selected,那么它被选中。

  • Array.prototype.concat。将累加器数组与选定的项目数组组合到包含两者的新数组中。

  • JSBin

    +0

    Gracias!感谢您的指导和帮助 –