【问题标题】:lodash pick object fields from arraylodash 从数组中选择对象字段
【发布时间】:2016-06-17 09:24:43
【问题描述】:

我有一组对象:

var results= [
    {         
      "_type": "MyType",
      "_id": "57623535a44b8f1417740a13",         
      "_source": {
        "info": {
          "year": 2010,
          "number": "string",             
        },
        "type": "stolen",           
        "date": "2016-06-16T00:00:00",
        "createdBy": "57469f3c71c8bf2479d225a6"            
      }
    }
  ];

我需要从数组中选择特定的字段。结果,我想得到以下结果:

[
    {
        "_id": "57623535a44b8f1417740a13",
        "info": {
            "year": 2010,
            "number": "string"
        },
        "type": "stolen",            
        "date": "2016-06-16T00:00:00",
        "createdBy": "57469f3c71c8bf2479d225a6"
    }
]

如您所见,我想选择_id 字段和_source 对象的内容。我怎样才能用 lodash 做到这一点?

我找到了.map 函数,但它不需要键数组: var res = _.map(results, "_source");

【问题讨论】:

    标签: javascript lodash


    【解决方案1】:

    你可以这样做:

    var mapped = _.map(results, _.partialRight(_.pick, ['_id', 'info', 'type', 'date', 'createdBy']));
    

    一点解释:

    1. _.map():需要一个从集合中获取每个项目的函数,以便您可以将其映射到其他内容。
    2. _.partialRight(): 采用一个函数,稍后将调用它的参数,并将其附加到末尾
    3. _.pick():从对象中获取指定的路径。

    【讨论】:

      【解决方案2】:

      在纯 Javascript 中,您可以使用 Array#map 进行迭代并为每个对象组装一个新对象,而不会破坏原始对象。

      var results = [{ "_type": "MyType", "_id": "57623535a44b8f1417740a13", "_source": { "info": { "year": 2010, "number": "string", }, "type": "stolen", "date": "2016-06-16T00:00:00", "createdBy": "57469f3c71c8bf2479d225a6" } }],
          res = results.map(function (a) {
              var o = { _id: a._id };
              ["info", "type", "date", "createdBy"].forEach(function (k) {
                  o[k] = a._source[k];
              });
              return o;
          });
      
      console.log(res);

      【讨论】:

      • 感谢您的回答,我知道如何使用纯JS,我的纯代码看起来和你的几乎一样,但是我经常使用lodash,以减少代码大小,提高可读性等等如果我能用 lodash 做到这一点,请看看路
      【解决方案3】:

      我有同样的要求,下面的解决方案最适合我。

      let users = [
      {
        "_id": "5ead7783ed74d152f86de7b0",
        "first_name": "User First name 1",
        "last_name": "User Last name 1",
        "email": "user1@example.com",
        "phone": 9587788888
      },
      {
        "_id": "5ead7b780d4bc43fd0ef92e7",
        "first_name": "User FIRST name 1",
        "last_name": "User LAST name 1",
        "email": "user2@example.com",
        "phone": 9587788888
      }
       ];
      
      users = users.map(user => _.pick(user,['_id','first_name']))
      
      console.log(users)
      <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

      【讨论】:

        【解决方案4】:

        var results = [{
          _type: "MyType",
          _id: "57623535a44b8f1417740a13",
          _source: {
            info: {
              year: 2010,
              number: "string",
            },
            type: "stolen",
            date: "2016-06-16T00:00:00",
            createdBy: "57469f3c71c8bf2479d225a6"
          }
        }];
        
        var rootProperty = ['_id']
        var innerProperty = '_source'
        
        var myArray = _.map(results, result => _(result)
          .pick(rootProperty)
          .assign(_.result(result, innerProperty))
          .value()
        )
        
        console.log(myArray)
        .as-console-wrapper { max-height: 100% !important; top: 0; }
        <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

        【讨论】:

          【解决方案5】:

          您可以map() 结果并将每个项目assign()_id 键值与_source 对象一起放在对象中。

          results = _.map(results, item => _.assign(
            { _id: item._id }, 
            item._source
          ));
          

          var results = [{
            "_type": "MyType",
            "_id": "57623535a44b8f1417740a13",
            "_source": {
              "info": {
                "year": 2010,
                "number": "string",
              },
              "type": "stolen",
              "date": "2016-06-16T00:00:00",
              "createdBy": "57469f3c71c8bf2479d225a6"
            }
          }];
          
          results = _.map(results, item => _.assign(
            { _id: item._id }, 
            item._source
          ));
          
          document.write('<pre>' + JSON.stringify(results, 0, 4) + '</pre>');
          &lt;script src="https://cdn.jsdelivr.net/lodash/4.13.1/lodash.min.js"&gt;&lt;/script&gt;

          你也可以选择用纯 JS 写这个:

          result = results.map(item => Object.assign(
            { _id: item._id }, item._source
          ));
          

          var results = [{
            "_type": "MyType",
            "_id": "57623535a44b8f1417740a13",
            "_source": {
              "info": {
                "year": 2010,
                "number": "string",
              },
              "type": "stolen",
              "date": "2016-06-16T00:00:00",
              "createdBy": "57469f3c71c8bf2479d225a6"
            }
          }];
          
          result = results.map(item => Object.assign(
            { _id: item._id }, item._source
          ));
          
          document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-11-27
            • 1970-01-01
            • 2023-01-29
            • 1970-01-01
            • 2017-07-13
            • 1970-01-01
            • 2017-12-13
            相关资源
            最近更新 更多