简体   繁体   中英

How to find the value nested inside an array of objects

Here I have to get value of file_info , I tried doing it using array.includes and array.find(), but got undefined.

My confusion here is related to, under ' facts ', the first value is "==", then it has array of values associated to it. I could not figure out to find the values inside that nested object.

I even tried array.find(facts).contains(fileinfo) that did not work as well.

How can I solve this ??

"data": [
  {
    "task-id": "126e7267",
    "type": "A",
    "output": {...} 

  },
  {
    "task-id": "bdfddff3",
    "type": "B",
    "output": {
      "id": "12b54370",
      "facts": [
        {
          "==": [
            "A",
            {
              "@type": "AA",
              "@value": {
                "id": "12b54370-4594-4033-a299-5480b593ee6d",
                "facts": [
                  {
                    "==": [
                      "time",
                      1575759643.904254
                    ]
                  },
                  {
                    "==": [
                      "mime",
                      "text/plain"
                    ]
                  },
                  {
                    "==": [
                      "owner",
                      1000
                    ]
                  },
                  {
                    "==": [
                      "size",
                      100
                    ]
                  },
                  {
                    "==": [
                      "file_info", 
                      "a0s5b2e6e739" // have to find and return this value
                    ]

                  },
                  {
                    "==": [
                      "time",
                      {
                        "@value": "2019-12-07T23:01:50.703Z",
                        "@type": "timestamp"
                      }
                    ]
                  },
                ],
              }
            }
          ]
        },
        ....
      ]
    }
  },
  {
    "task-id": "5f557eac",
    "type": "C",
    ....
  },

],

I have tried to validate your json string. It seems to be invalid. For answering this question , i would assume below string to be your json :

{"data":[{"task-id":"126e7267","type":"A","output":{}},{"task-id":"bdfddff3","type":"B","output":{"id":"12b54370","facts":[{"==":["A",{"@type":"AA","@value":{"id":"12b54370-4594-4033-a299-5480b593ee6d","facts":[{"==":[{"time":{"@value":"1575759643.904254"}}]},{"==":["mime","text/plain"]},{"==":["owner",1000]},{"==":["size",100]},{"==":[{"file_info":"a0s5b2e6e739"}]},{"==":["time",{"@value":"2019-12-07T23:01:50.703Z","@type":"timestamp"}]}]}}]}]}},{"task-id":"5f557eac","type":"C"}]}

I had tried to figure out a repetative pattern in your json but since "@value" tag is seen inside only one "facts" object below code should help you getting started . For given json , below code prints the value of "file_info"(Here , i'am assuming that "file_info" should be followed by a colon(:) ie "a0s5b2e6e739" is the value you are looking for) :

var jsonStr = '{"data":[{"task-id":"126e7267","type":"A","output":{}},{"task-id":"bdfddff3","type":"B","output":{"id":"12b54370","facts":[{"==":["A",{"@type":"AA","@value":{"id":"12b54370-4594-4033-a299-5480b593ee6d","facts":[{"==":[{"time":{"@value":"1575759643.904254"}}]},{"==":["mime","text/plain"]},{"==":["owner",1000]},{"==":["size",100]},{"==":[{"file_info":"a0s5b2e6e739"}]},{"==":["time",{"@value":"2019-12-07T23:01:50.703Z","@type":"timestamp"}]}]}}]}]}},{"task-id":"5f557eac","type":"C"}]}';
var jsonObj = JSON.parse(jsonStr);
//If there is a repetative pattern , you can replace this hard coding with your pattern.
var objArray = jsonObj["data"][1]["output"]["facts"][0]["=="][1]["@value"]["facts"];
console.log(objArray);

if(objArray && objArray.length >0){

    for(let i =0;i<objArray.length;i++){
        if(objArray[i] && objArray[i]["=="] && objArray[i]["=="].length > 0 && objArray[i]["=="][0]["file_info"]){
            //here "file_info" is fetched
            console.log('here ',objArray[i]["=="][0]["file_info"]);
        }

    }
}

Hope above code helps you to get started.

You can map and filter the object/array to get the result if the format is fixed. Here, I am writing to a Map and retrieving the property I need at the very end.

 let data = [ { "task-id": "126e7267", "type": "A", "output": {} }, { "task-id": "bdfddff3", "type": "B", "output": { "id": "12b54370", "facts": [ { "==": [ "A", { "@type": "AA", "@value": { "id": "12b54370-4594-4033-a299-5480b593ee6d", "facts": [ { "==": [ "time", 1575759643.904254 ] }, { "==": [ "mime", "text/plain" ] }, { "==": [ "owner", 1000 ] }, { "==": [ "size", 100 ] }, { "==": [ "file_info", "a0s5b2e6e739" // have to find and return this value ] }, { "==": [ "time", { "@value": "2019-12-07T23:01:50.703Z", "@type": "timestamp" } ] }, ], } } ] } ] } }, { "task-id": "5f557eac", "type": "C", "output": {} } ] const map = new Map() const facts = data .map(d => d.output) .filter(o => o.hasOwnProperty('facts')) .map(d => d.facts) .map(i => i[0]["=="][1]) .map(d => d["@value"].facts) const item = facts.forEach(o => o.forEach(i => map.set(i["=="][0], i["=="][1]))) console.log(map.get("file_info"))

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM