代码之家  ›  专栏  ›  技术社区  ›  Alex Parker

根据数组中另一个值的条件获取该数组中的嵌套值

  •  0
  • Alex Parker  · 技术社区  · 6 年前

    我很难为这个问题创造一个标题

    假设我有这样的数据:

    {"total_results":78,"resources":[{"metadata":{"verified_at":"2018-10-17T21:07:43.935Z","linkages":[{"origin":"ABC","id":"a"},{"origin":"XYZ","id":"b"}]}},{"metadata":{"verified_at":"2018-10-17T21:07:43.935Z","linkages":[{"origin":"ABC","id":"c"},{"origin":"XYZ","id":"d"}]}}]}
    

    考虑一下 resources 现场。我想输出一个包含 id "origin": "ABC" . 这个 身份证件

    这个代码片段可以工作,但是看起来太冗长了。一定有更简单的办法。

    _.map(_.filter(_.flatten(_.map(body.resources, 'metadata.linkages')),['origin','ABC']), 'id')
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   Akrion    6 年前

    你可以这样做:

    var data = { "total_results": 78, "resources": [ { "metadata": { "verified_at": "2018-10-17T21:07:43.935Z", "linkages": [{ "origin": "ABC", "id": "a" }, { "origin": "XYZ", "id": "b" }] } }, { "metadata": { "verified_at": "2018-10-17T21:07:43.935Z", "linkages": [{ "origin": "ABC", "id": "c" }, { "origin": "XYZ", "id": "d" }] } } ] }
    
     const result = _(data.resources)
      .flatMap('metadata.linkages')
      .filter(['origin', 'ABC'])
      .map('id')
      .value()
    	
    console.log(result)
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

    用链子和 flatMap filter & map

    另一种方法是 flatMap reduce :

    var data = { "total_results": 78, "resources": [ { "metadata": { "verified_at": "2018-10-17T21:07:43.935Z", "linkages": [{ "origin": "ABC", "id": "a" }, { "origin": "XYZ", "id": "b" }] } }, { "metadata": { "verified_at": "2018-10-17T21:07:43.935Z", "linkages": [{ "origin": "ABC", "id": "c" }, { "origin": "XYZ", "id": "d" }] } } ] }
    
    const result = _(data.resources)
      .flatMap('metadata.linkages')
      .reduce((r,c) => (_.isEqual(c.origin, 'ABC') ? r.push(c.id) : null, r), [])
    
    console.log(result)
    <脚本src=“https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js“></script>

    var data = { "total_results": 78, "resources": [{ "metadata": { "verified_at": "2018-10-17T21:07:43.935Z", "linkages": [{ "origin": "ABC", "id": "a" }, { "origin": "XYZ", "id": "b" }] } }, { "metadata": { "verified_at": "2018-10-17T21:07:43.935Z", "linkages": [{ "origin": "ABC", "id": "c" }, { "origin": "XYZ", "id": "d" }] } }] }
    
    const result = _.reduce(data.resources, (r,c) => 
       (r.push(_.find(c.metadata.linkages, {origin: 'ABC'}).id), r), [])
    
    console.log(result)
    <脚本src=“https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js“></script>

    使用ES6,您可以执行以下操作:

    var data = { "total_results": 78, "resources": [{ "metadata": { "verified_at": "2018-10-17T21:07:43.935Z", "linkages": [{ "origin": "ABC", "id": "a" }, { "origin": "XYZ", "id": "b" }] } }, { "metadata": { "verified_at": "2018-10-17T21:07:43.935Z", "linkages": [{ "origin": "ABC", "id": "c" }, { "origin": "XYZ", "id": "d" }] } }] }
    
    const result = data.resources.reduce((r,c) => 
       (r.push(c.metadata.linkages.find(x => x.origin == 'ABC').id), r), [])
    
    console.log(result)
    推荐文章