嵌套的 JSON 查找 - Javascript



所以我有问题:

我得到了这样的数据源

{
  "Class": "ScanLayers",
  "ExportVersion": 1,
  "Layers": {
    "0150e77a-9af5-ccc1-aa82-89793c1c4067": {
        "Class": "ScanTiles",
        "ExportVersion": 3,
        "MetadataUUID": "90a23cdc-9b2f-4788-935d-c539e59019c3",
        "Scan": "0150e77a-9af5-4b77-aa82-89793c1c4067",
        "ScanName": "ATT021"
    },
    "0150e77a-9af5-4b77-bb43-89793c1a4067": {
        "Class": "ScanTiles",
        "ExportVersion": 3,
        "MetadataUUID": "90a23cdc-9b2f-4788-935d-c5sad876adc3",
        "Scan": "0150e77a-9af5-4b77-bb43-89793c1a4067",
        "ScanName": "ATT022"
    }
  }
}

我希望能够找到某个扫描名称,然后返回其父级。举个例子。我想找到"ATT022".我会得到一个 UUID 的返回 ID,"0150e77a-9af5-4b77-bb43-89793c1a4067"我知道如果我有 UUID,这将很容易归还孩子。但我不明白如何找到孩子来回报父母。

使用本机 Array.prototype.findObject.keys(或 null (中获取所需条件的键,如下所示:

var obj = {
  'Class': "ScanLayers",
  'ExportVersion': 1,
  'Layers': {
    "0150e77a-9af5-ccc1-aa82-89793c1c4067": {
      "Class": "ScanTiles",
      "ExportVersion": 3,
      "MetadataUUID": "90a23cdc-9b2f-4788-935d-c539e59019c3",
      "Scan": "0150e77a-9af5-4b77-aa82-89793c1c4067",
      "ScanName": "ATT021"
    },
    "0150e77a-9af5-4b77-bb43-89793c1a4067": {
      "Class": "ScanTiles",
      "ExportVersion": 3,
      "MetadataUUID": "90a23cdc-9b2f-4788-935d-c5sad876adc3",
      "Scan": "0150e77a-9af5-4b77-bb43-89793c1a4067",
      "ScanName": "ATT022"
    }
  }
}
var scanName = "ATT022";
var found = Object.keys(obj.Layers).find(function(layerKey) {
  return obj.Layers[layerKey].ScanName == scanName;
});
if (found)
  console.log(found);
else
  console.log("Nothing found!");

如果这正是您的数据架构,则可以使用这样的函数(使用 ES6 语法(:

var obj = {
    "Class": "ScanLayers",
    "ExportVersion": 1,
    "Layers": {
        "0150e77a-9af5-ccc1-aa82-89793c1c4067": {
            "Class": "ScanTiles",
            "ExportVersion": 3,
            "MetadataUUID": "90a23cdc-9b2f-4788-935d-c539e59019c3",
            "Scan": "0150e77a-9af5-4b77-aa82-89793c1c4067",
            "ScanName": "ATT021"
        },
        "0150e77a-9af5-4b77-bb43-89793c1a4067": {
            "Class": "ScanTiles",
            "ExportVersion": 3,
            "MetadataUUID": "90a23cdc-9b2f-4788-935d-c5sad876adc3",
            "Scan": "0150e77a-9af5-4b77-bb43-89793c1a4067",
            "ScanName": "ATT022"
        }
    }
}
const getIdByScanName = (obj, name) => {
    for (id in obj['Layers']) {
        if (obj['Layers'][id]['ScanName'] === name) return id
    }
}
console.log(getIdByScanName(obj, "ATT021")) //0150e77a-9af5-ccc1-aa82-89793c1c4067
console.log(getIdByScanName(obj, "ATT022")) //0150e77a-9af5-4b77-bb43-89793c1a4067
console.log(getIdByScanName(obj, "ATT023")) //undefined (when key not found)


注意:在您的问题中,Layers子对象键之间缺少一个逗号(可能是拼写错误(。

我为您的问题创建了这个 jsbin。

你只需要将 3 个参数传递给这个函数,数据源、类型和字符串

checkName = function (obj,type,string) {
 for( var key in obj.Layers){
  if(obj.Layers[key][type] === string){
   return obj.Layers[key];
  }
 } 
}
console.log(checkName(dataSource,'ScanName','ATT022'))

它会返回这样的东西...

{
  Class: "ScanTiles",
  ExportVersion: 3,
  MetadataUUID: "90a23cdc-9b2f-4788-935d-c5sad876adc3",
  Scan: "0150e77a-9af5-4b77-bb43-89793c1a4067",
  ScanName: "ATT022"
}

最新更新