Использование подчеркивания для фильтрации вложенного объекта и возврата массива

#javascript #jestjs #underscore.js

#javascript #jestjs #underscore.js

Вопрос:

 const newData = _.pluck(_.flatten(_.values(file)), 'Message')
 

Это правильный способ вернуть массив со всеми значениями сообщений из этого гигантского вложенного объекта, и это здорово. Однако я хочу исключить значения, которые также заданы с помощью local = true в объекте.

Я хочу только вернуть [‘LAJDH’, ‘NPSABA’] . По сути, я пишу тесты в шутку, которые открывают тысячи файлов и возвращают мне массив для использования. Я экспортирую этот объект, который требуется на каждой итерации в моем тесте jest.

Это означает, что было бы здорово выполнить это как можно быстрее.

Пример данных:

 { onOrder: [],
  onGo: [],
  onDelivery:
   [ { Trigger: 'Ready To Dispatch',
       Channel: 'Mail',
       Message: 'AJDSA',
       local: true
       Recipient: [Array],
       Filter: [Array] },
     { Trigger: 'Ready to Delivery',
       Channel: 'Mail',
       Message: 'LAJDH',
       Recipient: [Array],
       Filter: [Array] } ],
  onDelay:
   [ { Trigger: 'Delay',
       Channel: 'Mail',
       Message: 'ABJSH',
       local: true,
       Recipient: [Array],
       Filter: [Array] } ],
  onDelivered:
   [ { Trigger:
       'Delivered',
       Channel: 'Mail',
       Message: 'NPSABA',
       Recipient: [Array],
       Filter: [Array] } ] }
 

Ответ №1:

_.reject это отрицательная функция фильтра подчеркивания. Все, что вам нужно сделать, это поместить его между _.flatten и _.pluck . Обратите внимание, что в этом коде используется сокращение iteratee .

 const newData = _.pluck(_.reject(_.flatten(_.values(file)), {local: true}), 'Message');
 

Совет: длинные выражения, подобные этим, становятся более удобочитаемыми _.chain .

 const newData = _.chain(file)
    .values()
    .flatten()
    .reject({local: true})
    .pluck('Message')
    .value();