Как правильно использовать метод lodash pick

Я пытаюсь использовать подчеркивание, чтобы отфильтровать определенные свойства объекта. Начало следующего кода работает как положено, но .pick не работает. Я стремлюсь ограничить свойства возвращаемого объекта теми строками, которые перечислены в .pick метод.

var result = _.chain(data)
  .each(function(item) {
    item.answers = [];
    _.each(data, function(object) {
      if (item.id === object.id) {
        item.answers.push({
          id: object.answer_id,
          email: object.answer_email,
          date: object.answer_date
        });
      }
    });
    item = _.pick(item,
      'id',
      'owner_id',
      'url',
      'enabled',
      'review_date',
      'answers'
    );
  })
  .uniq(function(item) {
    return item.id;
  })
  .value();

Массив, с которого я начинаю, "data", выглядит так:

[
  {
    id: '8ffdf27b-5a90-478a-b263-dhhdhdhhdhd',
    answer_date: Fri Oct 30 2015 14:35:07 GMT-0400 (EDT),
    answer_id: 1,
    answer_email: 'test@example.com',
    owner_id: 5,
    url: 'media/5-4a3640ac-ec13-fhhfh-ac0a-fhjhdhhdhd.jpg',
    enabled: false,
    review_date: Sun Nov 01 2015 13:57:32 GMT-0500 (EST)
  }, ...
]

Возвращенный массив должен выглядеть так:

[
  {
    id: '8ffdf27b-5a90-478a-b263-dhhdhdhhdhd',
    owner_id: 5,
    url: 'media/5-4a3640ac-ec13-fhhfh-ac0a-fhjhdhhdhd.jpg',
    enabled: false,
    review_date: Sun Nov 01 2015 13:57:32 GMT-0500 (EST),
    answers: [{...}, {...}]
  }, ...
]

но вместо этого в настоящее время выглядит так:

[
  {
    id: '8ffdf27b-5a90-478a-b263-dhhdhdhhdhd',
    answer_date: Fri Oct 30 2015 14:35:07 GMT-0400 (EDT),
    answer_id: 1,
    answer_email: 'test@example.com',
    owner_id: 5,
    url: 'media/5-4a3640ac-ec13-fhhfh-ac0a-fhjhdhhdhd.jpg',
    enabled: false,
    review_date: Sun Nov 01 2015 13:57:32 GMT-0500 (EST),
    answers: [{...}, {...}]
  }, ...
]

1 ответ

Решение

Вы должны использовать map() вместо each() чтобы изменить ваш массив (обратите внимание, что вы должны вернуть измененный элемент в функцию карты):

var result = _.chain(data)
.map(function (item) {
  item.answers = [];
  _.each(data, function (object) {
    if (item.id === object.id) {
      item.answers.push({
        id: object.answer_id,
        email: object.answer_email,
        date: object.answer_date
      });
    }
  });
  item = _.pick(item,
    'id',
    'owner_id',
    'url',
    'enabled',
    'review_date',
    'answers'
  );
  return item;
})
.uniq(function (item) {
  return item.id;
})
.value();
Другие вопросы по тегам