2017-03-06 115 views
1

我有一些JSON和想回一些嵌套的对象,这是JSON:如何返回嵌套数组与lodash?

{ 
    "existingPackage": { 
    "primaryBundle": { 
     "id": "2031", 
     "serviceId": "114297251", 
     "name": "TV - Entertainment, Drama, Movies", 
     "products": [ 
     { 
      "name": "Entertainment", 
      "id": "100", 
      "price": 2600, 
      "gifted": false 
     }, 
     { 
      "name": "Drama", 
      "id": "104", 
      "price": 2000, 
      "gifted": false, 
      "swappableProducts": [ 
      { 
       "name": "Sport", 
       "id": "107", 
       "price": 2500, 
       "gifted": false 
      } 
      ] 
     }, 
     { 
      "name": "Movies", 
      "id": "105", 
      "price": 2000, 
      "gifted": false, 
      "swappableProducts": [ 
      { 
       "name": "Sport", 
       "id": "107", 
       "price": 2500, 
       "gifted": false 
      } 
      ] 
     } 
     ] 
    } 
    } 
} 

的目标是从有swappableProducts财产,并有一定的id productsarray返回唯一项目。 因此,例如,当我的productId参数= 105,然后我想回:

{ 
      "name": "Movies", 
      "id": "105", 
      "price": 2000, 
      "gifted": false, 
      "swappableProducts": [ 
      { 
       "name": "Sport", 
       "id": "107", 
       "price": 2500, 
       "gifted": false 
      } 
      ] 
     } 
} 

如何我lodash返回此?

+0

可能重复的[如何使用lodash从数组中找到并返回一个对象?](http://stackoverflow.com/questions/31054021/how-to-use-lodash-to-find-and-return-一个对象-从阵列) – Rajesh

回答

1

这里是我的方法:

_.filter(
    products, 
    i => _.every([ 
    _.has(i, 'swappableProducts'), 
    _.eq(_.result(i, 'id'), '105') 
    ]) 
); 

这个想法是将两个谓词都传递给every()。第一个使用has()来检查swappableProducts属性是否存在。第二个谓词结合eq()result()来检查id值。

0

你可以做这样的事情

_.filter(data.existingPackage.primaryBundle.products, 
     function(o) { 
      return o.swappableProducts !== undefined && o.id==="105"; 
     }); 
0

这里是返回预期结果的功能

const getProducts = obj => obj.existingPackage.primaryBundle.products; 
 

 
const withSwappable = _.curry((myId, obj) => _.result(obj, 'swappableProducts[0].id', false) == myId) 
 

 
function getProductsWithId(data, myId) { 
 
    return _.filter(getProducts(data), withSwappable(myId)) 
 
} 
 

 
const data = { 
 
    "existingPackage": { 
 
    "primaryBundle": { 
 
     "id": "2031", 
 
     "serviceId": "114297251", 
 
     "name": "TV - Entertainment, Drama, Movies", 
 
     "products": [{ 
 
      "name": "Entertainment", 
 
      "id": "100", 
 
      "price": 2600, 
 
      "gifted": false 
 
     }, 
 
     { 
 
      "name": "Drama", 
 
      "id": "104", 
 
      "price": 2000, 
 
      "gifted": false, 
 
      "swappableProducts": [{ 
 
      "name": "Sport", 
 
      "id": "107", 
 
      "price": 2500, 
 
      "gifted": false 
 
      }] 
 
     }, 
 
     { 
 
      "name": "Movies", 
 
      "id": "105", 
 
      "price": 2000, 
 
      "gifted": false, 
 
      "swappableProducts": [{ 
 
      "name": "Sport", 
 
      "id": "107", 
 
      "price": 2500, 
 
      "gifted": false 
 
      }] 
 
     } 
 
     ] 
 
    } 
 
    } 
 
} 
 

 

 
console.log(getProductsWithId(data, "107")); 
 
console.log(getProductsWithId(data, "100"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>