2017-03-06 3 views
1

Ich habe einige json und möchte einige verschachtelten Objekten zurückkehren, ist dies der json:Wie kann ich verschachtelte Arrays mit lodash zurückgeben?

{ 
    "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 
      } 
      ] 
     } 
     ] 
    } 
    } 
} 

Das Ziel ist nur Elemente aus dem productsarray zurückzukehren, die die swappableProducts Eigenschaft haben, und haben eine bestimmte ID. So zum Beispiel, wenn ich ein productId = 105, dann würde ich zurückkehren möchte:

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

Wie kann ich wieder diese mit lodash?

+0

Mögliches Duplikat von [Wie lodash verwenden, um ein Objekt von Array zu finden und zurück?] (Http://stackoverflow.com/questions/31054021/how-to-use-lodash-to-find-and-return- Ein-Objekt-von-Array) – Rajesh

Antwort

1

Hier ist mein Ansatz zurück:

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

Die Idee besteht darin, beide Prädikate an every() zu übergeben. Die erste verwendet has(), um zu überprüfen, ob die swappableProducts-Eigenschaft vorhanden ist. Das zweite Prädikat verbindet eq() und result() den id Wert zu überprüfen.

0

Sie etwas tun könnte, wie dieser

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

Hier ist eine Funktion, die gewünschte Ergebnis

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>

Verwandte Themen