JSON Obtenez de l'objet parent de l'enfant objet

Comment puis-je obtenir discount valeur si brand_id=='983' .

échantillon JSON:

{
     "prods": [
               {
            "info": {
                  "rate": 100
                    },
            "grocery": [
                     {
                      "brand": "A",
                      "brand_id": "983"
                     },
                     {
                      "brand": "B",
                      "brand_id": "253"
                     }
                     ],
             "discount": "20"
         }
     ]
}

Ce que j'ai essayé jusqu'à présent est

$.prods[*].grocery[?(@.brand_id=='983')]

ceci me renvoie la liste/tableau d'objets appariés. Mais je ne suis pas capable de retourner dans l'arbre. Toute aide à ce sujet?

8
demandé sur Vivek Singh 2016-02-25 23:52:52

2 réponses

en effet, JSONPath n'est pas très bon à cela, donc j'ai abordé ce genre de problème avec ma propre petite bibliothèque; donc, voici un violon pour votre exemple:

https://jsfiddle.net/YSharpLanguage/j9oetwnn/3

où:

var products = {
     "prods": [
        {
            "info": {
                  "rate": 85
                    },
            "grocery": [
                     {
                      "brand": "C",
                      "brand_id": "984"
                     },
                     {
                      "brand": "D",
                      "brand_id": "254"
                     }
                     ],
             "discount": "15"
        },
        {
            "info": {
                  "rate": 100
                    },
            "grocery": [
                     {
                      "brand": "A",
                      "brand_id": "983"
                     },
                     {
                      "brand": "B",
                      "brand_id": "253"
                     }
                     ],
             "discount": "20"
         }
     ]
};

function GroceryItem(obj) {
  return (typeof obj.brand === "string") && (typeof obj.brand_id === "string");
}

    // last parameter set to "true", to grab all the "GroceryItem" instances
    // at any depth:
var itemsAndDiscounts = [ products ].nodeset(GroceryItem, true).
    map(
      function(node) {
        var item = node.value, // node.value: the current "GroceryItem" (aka "$.prods[*].grocery[*]")

            discount = node.parent. // node.parent: the array of "GroceryItem" (aka "$.prods[*].grocery")
                       parent. // node.parent.parent: the product (aka "$.prods[*]")
                       discount; // node.parent.parent.discount: the product discount

        // finally, project into an easy-to-filter form:
        return { id: item.brand_id, discount: discount };
      }
    ),
    discountOfItem983;

discountOfItem983 = itemsAndDiscounts.
  filter
  (
    function(mapped) {
      return mapped.id === "983";
    }
  )
  [0].discount;

console.log("All items and discounts: " + JSON.stringify(itemsAndDiscounts, null, 2));

console.log("Discount of #983: " + discountOfItem983);

donne:

All items and discounts: [
  {
    "id": "984",
    "discount": "15"
  },
  {
    "id": "254",
    "discount": "15"
  },
  {
    "id": "983",
    "discount": "20"
  },
  {
    "id": "253",
    "discount": "20"
  }
]
Discount of #983: 20

Voici d'autres exemples / cas d'utilisation:

JSON-pour-certains-balisage

JSON transformations, revisité XSLT (sosie)

(at: https://jsfiddle.net/YSharpLanguage/kj9pk8oz/10 )

JSON-to-JSON

Super-léger JSON-à-JSON transformations

(at: https://jsfiddle.net/YSharpLanguage/ppfmmu15/10 )

un équivalent JavaScript de...

XSLT 3.0 REC Section 14.4 exemple: regroupement de noeuds basé sur des valeurs communes

(at: http://jsfiddle.net/YSharpLanguage/8bqcd0ey/1 )

cf. https://www.w3.org/TR/xslt-30/#grouping-examples

un équivalent JavaScript de...

JSONiq Cas D'Utilisation De La Section 1.1.2. Regrouper les requêtes pour JSON

(at: https://jsfiddle.net/YSharpLanguage/hvo24hmk/3 )

cf. http://jsoniq.org/docs/JSONiq-usecases/html-single/index.html#jsongrouping

'Espère que cette aide,

2
répondu YSharp 2016-03-03 04:10:25

vous pouvez écrire une fonction qui renvoie le noeud parent. Une fois que vous avez cela, vous devriez développer une fonction qui marche (traverse) tout l'objet et tous ses noeuds et tableaux, et quand il trouve L'Id désiré, bien, vous obtenez juste le parent et récupérez pour le rabais.

Voici l'exemple le plus simple d'une fonction qui renvoie le noeud parent:

const myVar = {
  "prods": [{
    "info": {
      "rate": 100
    },
    "grocery": [{
        "brand": "A",
        "brand_id": "983",
        myParent: function() {
          const that = this; // to fix the caller instead of using 'bind' or 'apply'
          return that;
        }
      },
      {
        "brand": "B",
        "brand_id": "253",
        myParent: function() {
          const that = this;
          return that;
        }
      }
    ],
    "discount": "20"
  }]
}
function myFunction() {
    let x = document.getElementById("myNumber").value;
    let text = myVar.prods[0].grocery.find(el => el.brand_id === x).myParent().brand; 
    document.getElementById("demo").innerHTML = text;
}
<input type="number" id="myNumber" value="253">
<button onclick="myFunction()">Try it</button>
<p id="demo"></p>
0
répondu Soldeplata Saketos 2017-08-08 07:37:19