如何使用Javascript或JQuery搜索巨大的JSON

时间:2019-04-30 03:54:23

标签: javascript jquery json treeview

在我的应用程序中,Web服务返回了JSON文件的大型数据集。这是我的JSON字符串的一部分。

[
       {
          "Value":"21",
          "Province":"Default",
          "Branches":[
             {
                "Value":"1108",
                "Province":"Davie",
                "IsValid":"False"
             },
             {
                "Value":"1107",
                "Province":"Ab area109",
                "IsValid":"False"
             },
             {
                "Value":"1105",
                "Province":"Hollywood",
                "IsValid":"False"
             }
          ]
       },
       {
          "Value":"17",
          "Province":"East",
          "Branches":[
             {
                "Value":"212",
                "Province":"area109",
                "IsValid":"False"
             },
             {
                "Value":"219",
                "Province":"area116",
                "IsValid":"False"
             }
          ]
       },
       {
          "Value":"24",
          "Province":"East11",
          "Branches":[
             {
                "Value":"211",
                "Province":"area108",
                "IsValid":"False"
             },
             {
                "Value":"218",
                "Province":"area109",
                "IsValid":"False"
             },
             {
                "Value":"1102",
                "Province":"area999",
                "IsValid":"False"
             }
          ]
       },
       {
          "Value":"25",
          "Province":"hilton25",
          "Branches":[
             {
                "Value":"213",
                "Province":"area110",
                "IsValid":"False"
             },
             {
                "Value":"220",
                "Province":"area999",
                "IsValid":"False"
             }
          ]
       }
]

我需要搜索省名并获得所有匹配的节点,直到其父节点为止。这意味着我需要按“根”级别和“分支”级别搜索provine名称。

例如1。。当搜索key = Default时,将返回以下JSON。

[
       {
          "Value":"21",
          "Province":"Default",
          "Branches":[
             {
                "Value":"1108",
                "Province":"Davie",
                "IsValid":"False"
             },
             {
                "Value":"1107",
                "Province":"Ab area109",
                "IsValid":"False"
             },
             {
                "Value":"1105",
                "Province":"Hollywood",
                "IsValid":"False"
             }
          ]
       }
]

例如2。。当返回key = area110之后,将返回遵循JSON的搜索。

[
    {
      "Value":"25",
      "Province":"hilton25",
      "Branches":[
         {
            "Value":"213",
            "Province":"area110",
            "IsValid":"False"
         }
      ]
    }
]

如何使用Javascript或JQuery执行此操作。请帮助我。

3 个答案:

答案 0 :(得分:1)

在JavaScript中,您可以调用JSON.parse()将该输入解析为JavaScript对象数组。从那里开始,通过几个for-of循环就非常简单。

function searchProvince(prov) {
  var result = [];
  var json; // JSON string (or you can pass it in as a function parameter)
  /*
   * if you don't already have the JSON string, get it here
   */
  var objects = JSON.parse(json); // parse JSON string as JavaScript Object array
  for (obj of objects) {
    // if the base Province matches, take the whole object
    if (obj.Province === prov) {
      result.push(obj);
    } else {
      // otherwise, only take the branches that have a matching Province
      var toAdd = {Value: obj.Value, Province: obj.Province, Branches: []};
      for (branch of obj.Branches) {
        if (branch.Province === prov) {
          toAdd.Branches.push(branch);
        }
      }
      // only add the copy if any branches were matched
      if (toAdd.Branches.length) {
        result.add(toAdd);
      }
    }
  }
  return JSON.stringify(result); // returns the result as a JSON string
  // can also return result if you want the array of JavaScript Objects
}

自从我用JS开发以来已经有一段时间了,所以如果这可以更清洁,请告诉我!

答案 1 :(得分:1)

一种可能的解决方案是使用Array.filter()仅保留满足以下条件之一的objects

  • A)Province的{​​{1}}属性与搜索到的相关object相匹配。
  • B) key数组中的某些object与搜索到的Branches匹配。

如果满足条件 B),我们还使用key将匹配的filter()仅保留在objects数组中。

Branches
let input=[{"Value":"21","Province":"Default","Branches":[{"Value":"1108","Province":"Davie","IsValid":"False"},{"Value":"1107","Province":"Ab area109","IsValid":"False"},{"Value":"1105","Province":"Hollywood","IsValid":"False"}]},{"Value":"17","Province":"East","Branches":[{"Value":"212","Province":"area109","IsValid":"False"},{"Value":"219","Province":"area116","IsValid":"False"}]},{"Value":"24","Province":"East11","Branches":[{"Value":"211","Province":"area108","IsValid":"False"},{"Value":"218","Province":"area109","IsValid":"False"},{"Value":"1102","Province":"area999","IsValid":"False"}]},{"Value":"25","Province":"N25","Branches":[{"Value":"213","Province":"area110","IsValid":"False"},{"Value":"220","Province":"area999","IsValid":"False"}]}]

const filterByProvinceKey = (arr, key) =>
{
    return arr.filter(parent =>
    {
        let someChildMatch = parent.Branches.some(
            child => child.Province === key
        );

        if (parent.Province === key)
        {
            return true;
        }
        else if (someChildMatch)
        {
            parent.Branches = parent.Branches.filter(c => c.Province === key);
            return true;
        }

        return false;
    });
}

console.log("Key = 'Default':", filterByProvinceKey(input, "Default"));
console.log("Key = 'area110':", filterByProvinceKey(input, "area110"));

如果您输入的是.as-console {background-color:black !important; color:lime;} .as-console-wrapper {max-height:100% !important; top:0;}(字符串),那么您将需要先使用JSON.parse()

JSON

如果您不需要对let input = JSON.parse(<some_json>); 进行严格匹配,而您想保留key名称的一部分与搜索Province匹配的位置,那么您可以为此使用String.match()

key
let input=[{"Value":"21","Province":"Default","Branches":[{"Value":"1108","Province":"Davie","IsValid":"False"},{"Value":"1107","Province":"Ab area109","IsValid":"False"},{"Value":"1105","Province":"Hollywood","IsValid":"False"}]},{"Value":"17","Province":"East","Branches":[{"Value":"212","Province":"area109","IsValid":"False"},{"Value":"219","Province":"area116","IsValid":"False"}]},{"Value":"24","Province":"East11","Branches":[{"Value":"211","Province":"area108","IsValid":"False"},{"Value":"218","Province":"area109","IsValid":"False"},{"Value":"1102","Province":"area999","IsValid":"False"}]},{"Value":"25","Province":"N25","Branches":[{"Value":"213","Province":"area110","IsValid":"False"},{"Value":"220","Province":"area999","IsValid":"False"}]}]

const filterByProvinceKey = (arr, key) =>
{
    let reKey = new RegExp(key, "i");

    return arr.filter(parent =>
    {
        let someChildMatch = parent.Branches.some(
            child => child.Province.match(reKey)
        );

        if (parent.Province.match(reKey))
        {
            return true;
        }
        else if (someChildMatch)
        {
            parent.Branches = parent.Branches.filter(c => c.Province.match(reKey));
            return true;
        }

        return false;
    });
}

console.log("Key = 'AreA':", filterByProvinceKey(input, "area"));

答案 2 :(得分:1)

尝试一下,希望对您有所帮助。

let inp = [
       {
          "Value":"21",
          "Province":"Default",
          "Branches":[
             {
                "Value":"1108",
                "Province":"Davie",
                "IsValid":"False"
             },
             {
                "Value":"1107",
                "Province":"Ab area109",
                "IsValid":"False"
             },
             {
                "Value":"1105",
                "Province":"Hollywood",
                "IsValid":"False"
             }
          ]
       },
       {
          "Value":"17",
          "Province":"East",
          "Branches":[
             {
                "Value":"212",
                "Province":"area109",
                "IsValid":"False"
             },
             {
                "Value":"219",
                "Province":"area116",
                "IsValid":"False"
             }
          ]
       },
       {
          "Value":"24",
          "Province":"East11",
          "Branches":[
             {
                "Value":"211",
                "Province":"area108",
                "IsValid":"False"
             },
             {
                "Value":"218",
                "Province":"area109",
                "IsValid":"False"
             },
             {
                "Value":"1102",
                "Province":"area999",
                "IsValid":"False"
             }
          ]
       },
       {
          "Value":"25",
          "Province":"hilton25",
          "Branches":[
             {
                "Value":"213",
                "Province":"area110",
                "IsValid":"False"
             },
             {
                "Value":"220",
                "Province":"area999",
                "IsValid":"False"
             }
          ]
       }
];

var key =   prompt("Please enter the key");   // Your search key
var result =[]
for(d in inp){
if(inp[d]['Province']==key)
result.push(inp[d])
for(d1 in inp[d]['Branches'])
if(inp[d]['Branches'][d1]['Province']==key)
result.push(inp[d])

}
console.log(result)