试图学习一个概念。 如果我有键对象的对象和键数组。
const orders = {
"key1" : { id: "key1", number: "ORD001" },
"key3" : { id: "key3", number: "ORD003" },
"key2" : { id: "key2", number: "ORD002" },
};
和一个数组:
const selectedOrders = ["key1","key2"];
并在Redux Reselect
的帮助下。我想要一个新对象,如:
const orders = {
"key1" : { id: "key1", number: "ORD001" selected: true},
"key3" : { id: "key3", number: "ORD003" selected: false },
"key2" : { id: "key2", number: "ORD002" selected: true },
};
因此,稍后我可以通过Object.keys(this.orders)
遍历该对象并设置所选样式的样式。
在这种用例中使用“重新选择”是否正确?如果是,那么我应该如何以高效且惯用的方式检入,外部数组是否包含给定的密钥?
如果这种想法对于这种用例是完全错误的,那么我应该如何以正确的方式做到这一点?
附录:也可能有另一个数组,其中包含依次显示这些顺序的键。 (用户可以重新订购商品)。
附言我不想为orders
集合使用对象数组。
答案 0 :(得分:1)
是的,您可以使用reselect组合两组数据以产生第三组数据。由于重新选择的备忘录,如果输入不变,则计算只需执行一次。
// You'll need some input selectors to pluck the raw orders from your redux store.
// I'm making these up, since i don't know how your store is arranged.
const getOrders = (state) => state.orders;
const getSelectedOrders = (state) => state.selectedOrders;
const getAugmentedOrders = createSelector(
[getOrders, getSelectedOrders],
(orders, selectedOrders) => {
const augmentedOrders = {};
Object.keys(orders).forEach(key => {
augmentedOrders[key] = {
...orders[key],
selected: selectedOrders.includes(key),
}
});
return augmentedOrders;
}
);
如果您有很多选定的订单,那么每次循环执行selectedOrders.includes
可能是性能问题。在那种情况下,我将创建一个selectedOrders的集合,因为对集合的查找将是恒定时间。
(orders, selectedOrders) => {
const selectedSet = new Set(selectedOrders);
const augmentedOrders = {};
Object.keys(orders).forEach(key => {
augmentedOrders[key] = {
...orders[key],
selected: selectedSet.has(key),
}
});
return augmentedOrders;
}