在重新选择选择器中,如果对象键存在于另一个数组中,则用键对象扩展对象

时间:2019-05-13 20:24:25

标签: javascript redux reselect

试图学习一个概念。 如果我有键对象的对象和键数组。

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集合使用对象数组。

1 个答案:

答案 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;
  }
相关问题