【问题标题】:lodash map and picklodash 地图和选择
【发布时间】:2017-02-21 16:52:20
【问题描述】:

给定一个数组

var test = [{a:1, b:2, c:3}, {a:4, b:5, c:6}, {a:7, b:8, c:9}]

如何使用 lodash 获得一组新对象,例如 [{b:2, c:3}, {b:5, c:6}, {b:8, c:9}]

我试过_.map(test, _pick(???, ['b', 'c'])} 我应该在??? 中输入什么?

【问题讨论】:

标签: javascript underscore.js lodash


【解决方案1】:

您需要将函数传递给映射,并且在 ES6 中您可以像这样使用箭头函数。

var test = [{a:1, b:2, c:3}, {a:4, b:5, c:6}, {a:7, b:8, c:9}]

var result = _.map(test, e => _.pick(e, ['b', 'c']))
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>

【讨论】:

    【解决方案2】:

    这与提出的问题无关,这可以通过 ES6 轻松完成。

    test.map(({ b, c }) => { 
      return { b, c }
    });
    

    【讨论】:

    • 甚至更短(在简单的情况下):test.map(({ b, c }) => ({ b, c });
    • 这很干净,看起来更漂亮,但要等同于所提出的问题,您还需要检查 test 不为空或适当地处理错误。如果测试为空,Lodash 将返回一个空数组。
    • 这种方法非常有限,因为无法预定义映射函数——您每次都需要创建一个定制的映射函数。使用字符串数组,例如['b', 'c'],意味着您可以创建一个可重用的函数,在其中首先传递道具路径数组,然后返回映射函数
    【解决方案3】:

    如果你不想也不需要使用lodash,如果你使用babel(es6)你可以使用解构来解决问题

    var test = [{a:1, b:2, c:3}, {a:4, b:5, c:6}, {a:7, b:8, c:9}]
    
    let newList = test.map(({b, c})=>{
     return {b,c}
    });
    
    document.body.append(JSON.stringify(newList));

    【讨论】:

      【解决方案4】:
      _.chain(test).map(function(e){return _.pick(e, ['b','c'])}).value();
      

      【讨论】:

        【解决方案5】:

        _.partialRight()可用于@Sean的试用,如_.map(test, _pick(???, ['b', 'c']))

        _.map(test, _.partialRight(_.pick, ['b', 'c']));
        
        // result: [ { b: 2, c: 3 }, { b: 5, c: 6 }, { b: 8, c: 9 } ]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-18
          • 1970-01-01
          • 1970-01-01
          • 2023-03-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多