Может ли мой редуктор использовать набор в качестве начального значения? - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь уменьшить массив объектов до набора уникальных значений. Для этого я пытаюсь использовать Set в качестве аккумулятора для операции reduce().

subscriptions = [
    {list_id: 'abc', name: 'nom', subscribed: true},
    {list_id: 'abc', name: 'nom', subscribed: true},
    {list_id: 'ghi', name: 'nom', subscribed: false}];

return subscriptions.reduce((accumulator, currentValue) => {
    if (currentValue.subscribed) {
      return accumulator.add(currentValue.list_id);
    }
  }, new Set());

Мои тесты сообщают о следующей ошибке:

TypeError: Невозможно прочитать свойство 'add' из неопределенного

Возможно ли то, что я пытаюсь сделать? Мне нужно сделать это как-нибудь по-другому?

Ответы [ 2 ]

0 голосов
/ 14 января 2019

Вместо уменьшения массива вы можете сначала отфильтровать и отобразить list_id и взять конструктор Set.

var subscriptions = [{ list_id: 'abc', name: 'nom', subscribed: true }, { list_id: 'abc', name: 'nom', subscribed: true }, { list_id: 'ghi', name: 'nom', subscribed: false }],
    uniqueIds = new Set(subscriptions
        .filter(({ subscribed }) => subscribed)
        .map(({ list_id }) => list_id)
    );

console.log([...uniqueIds]);
0 голосов
/ 14 января 2019

Вам необходимо вернуть accumulator в случае сбоя условия if. в противном случае по умолчанию возвращается undefined (неявно).

let subscriptions = [
    {list_id: 'abc', name: 'nom', subscribed: true},
    {list_id: 'abc', name: 'nom', subscribed: true},
    {list_id: 'ghi', name: 'nom', subscribed: false}];

let  op = subscriptions.reduce((accumulator, currentValue) => {
    if (currentValue.subscribed) {
      accumulator.add(currentValue.list_id);
    }
    return accumulator
  }, new Set());
  
  console.log([...op])
...