从一组

时间:2016-01-26 15:50:18

标签: javascript arrays ember.js

我有一个项目数组,每个项目都有item_type属性,可以是四种不同类型之一(这是一个项目的购物车)。当我试图"支付"对于购物车中的商品,我需要将剩余的所有商品分成每个商品类型的数组,以便发送回服务器,以便更新正确的表格。我只是想使用一个地图来做这个,但这需要多次通过(至少我认为我需要这样做的方式)但是有一种更快的方法来获取一个数组并将其分成多个数组,基于a属性?

具体来说,我需要知道哪个阵列是哪个(哪一个有抽奖券,捐赠等)所以我可以使用正确的属性名称将它们发布到服务器,以便服务器知道什么是数组以及如何继续每个

目前正在使用这个是我如何解决这个问题。不是很多代码,但我仍然想知道是否有一些可以在这里完成的重构

// ARRAYS OF CLASSES
itemsArray: Ember.computed.filterBy('model.items','item_type','bid'),
donationsArray: Ember.computed.filterBy('model.items','item_type','donation'),
ticketsArray: Ember.computed.filterBy('model.items','item_type','ticket'),
rafflesArray: Ember.computed.filterBy('model.items','item_type','raffle'),

// ARRAYS OF JUST CLASS IDS
itemIds: Ember.computed.mapBy('itemsArray','id'),
donationIds: Ember.computed.mapBy('donationsArray','id'),
ticketIds: Ember.computed.mapBy('ticketsArray','id'),
raffleIds: Ember.computed.mapBy('rafflesArray','id'),

1 个答案:

答案 0 :(得分:1)

好的,首先你的代码绝对没问题。

我有兴趣比较使用观察者的性能而不是创建4个计算属性,所以我创建了这个twiddle。我还没有找到好的方法来绝对确定1种方式绝对比另一种方式更快,但是您可以使用其他方式在代码中使用。

createArrays: Ember.on('init', Ember.observer('model.items.@each.item_type', function() {
    console.log('observer fired');
    const items = this.get('model.items'),
          itemsArray = [],
          donationsArray = [],
          rafflesArray = [],
          ticketsArray = [];

    items.forEach(item => {
        switch (Ember.get(item, 'item_type')) {
        case 'bid':
          itemsArray.pushObject(item);
          break;
        case 'donation':
          donationsArray.pushObject(item);
          break;
        case 'ticket':
          ticketsArray.pushObject(item);
          break;
        default:
          rafflesArray.pushObject(item);
          break;
      }
    });

    this.setProperties({
      itemsArray,
      donationsArray,
      ticketsArray,
      rafflesArray
    });
  })),

但我认为不值得改变。

你可以做的另一件事是以编程方式创建那些8个计算属性,但它可能会比现在更多的代码。如果你有10而不是4 item_type,那就值得做。