如何使用lodash链接获取并映射结果?

时间:2017-01-20 03:30:11

标签: lodash

我有一个列表我试图从使用_.get拉取一个对象,但是在选择之后我需要遍历该对象以创建一个新属性。到目前为止,我已成功使用_.get和_.map的组合,如下所示,但我希望我能以某种方式使用_.chain。

var selected = _.get(results, selectedId);
return _.map([selected], result => {
  var reviews = result.reviews.map(review => {
    var reviewed = review.userId === authenticatedUserId;
    return _.extend({}, review, {reviewed: reviewed});
  });
  return _.extend({}, result, {reviews: reviews});
})[0];

是否可以使用map以外的其他方式进行这样的转换(因为map需要我打破它/创建一个包含solo项目的数组)。提前谢谢!

1 个答案:

答案 0 :(得分:3)

我可以看到您正在创建不必要的map()来电,您可以将所有这些工作简化为以下内容:

var output = {
  reviews: _.map(results[selectedId], function(review) {
    return _.defaults({
      reviewed: review.userId === authenticatedUserId
    }, review);
  })
};

defaults()方法类似于extend(),除非设置了属性,否则会忽略相同属性的其他值。

var selectedId = 1;
var authenticatedUserId = 1;

var results = {
  1: [
    { userId: 1, text: 'hello' },
    { userId: 2, text: 'hey' },
    
    { userId: 1, text: 'world?' },
    { userId: 2, text: 'nah' },
   ]
};

var output = {
  reviews: _.map(results[selectedId], function(review) {
    return _.defaults({
      reviewed: review.userId === authenticatedUserId
    }, review);
  })
};

document.body.innerHTML = '<pre>' + JSON.stringify(output, 0, 4) + '</pre>';
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>