2017-03-06 119 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>