При повторном выборе селектора можно дополнить объект объектами с ключом, если ключ объекта существует в другом массиве - PullRequest
0 голосов
/ 13 мая 2019

Попытка выучить концепцию. Если у меня есть Объект объектов с ключами и массив ключей.

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) и стилизовать выбранные элементы. Правильно ли использовать Reselect для такого варианта использования? Если да, то как мне проверить эффективным и идиоматическим образом, содержит ли внешний массив заданный ключ? Если эта идея совершенно не подходит для такого варианта использования, то как мне сделать это правильно? Приложение: Там также может быть другой массив, который содержит ключи в последовательности, как эти ордера должны отображаться. (Пользователь может изменить порядок элементов). Постскриптум Я не хочу использовать массив объектов для orders коллекции.

1 Ответ

1 голос
/ 13 мая 2019

Да, вы можете использовать перевыбор, чтобы объединить два набора данных для создания третьего набора. Из-за повторного выбора запоминания, если входные данные не изменяются, то вычисление необходимо выполнить только один раз.

// 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 каждый раз в цикле может быть проблемой производительности. В этом случае я бы создал Set of selectedOrders, так как поиск в Set будет постоянным.

  (orders, selectedOrders) => {
    const selectedSet = new Set(selectedOrders);
    const augmentedOrders = {};
    Object.keys(orders).forEach(key => {
      augmentedOrders[key] = {
        ...orders[key],
        selected: selectedSet.has(key),
      }
    });
    return augmentedOrders;
  }
...