我有一个项目数组,每个项目都有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'),
答案 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
,那就值得做。