如何找到嵌套在对象数组中的值

时间:2019-12-08 00:45:20

标签: javascript arrays json object

在这里,我必须获取 file_info 的值,我尝试使用array.includes和array.find()进行操作,但未定义。

我在这里的困惑与“事实”中的第一个值是“ ==”有关,然后它具有与之相关的值数组。我找不到在该嵌套对象中找到值的方法。

我什至尝试了array.find(facts).contains(fileinfo),但效果不佳。

我该如何解决?

"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",
    ....
  },

],

2 个答案:

答案 0 :(得分:0)

我尝试验证您的json字符串。似乎无效。为了回答这个问题,我假设下面的字符串是您的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"}]}

我试图找出json中的重复模式,但是由于“ @value”标记仅出现在代码下面的一个“事实”对象内,因此可以帮助您入门。对于给定的json,下面的代码显示“ file_info”的值(在这里,我假设“ file_info”后应加一个冒号(:),即“ a0s5b2e6e739”是您要查找的值):

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"]);
        }

    }
}

希望以上代码可以帮助您入门。

答案 1 :(得分:0)

如果格式固定,则可以映射和过滤对象/数组以获得结果。在这里,我正在写地图,并在最后获取所需的属性。

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"))