Javascript 解析与值匹配的完整json和搜索键

Javascript 解析与值匹配的完整json和搜索键,javascript,json,algorithm,recursion,data-structures,Javascript,Json,Algorithm,Recursion,Data Structures,我想在javascript中遍历整个JSON,并找到从特定键开始的值。 假设这是我的JSON数据: var data = { "array": [ 1, 2, 3 ], "boolean": true, "null": null, "number": 123, "object": { "a": "b", "abc":{ "mohit_ab": { "id1":"i am id 1", "a

我想在javascript中遍历整个JSON,并找到从特定键开始的值。 假设这是我的JSON数据:

var data = {
  "array": [
    1,
    2,
    3
  ],
  "boolean": true,
  "null": null,
  "number": 123,
  "object": {
    "a": "b",
    "abc":{
      "mohit_ab": {
        "id1":"i am id 1",
        "abcd":{
          "a" :"b",
          "c":"d"
        },
        "who" : "who are you",
        "id2":"i am id 2"
      },
      "mohit_231abcd": {
        "id1":"i am id 3",
        "identity" : "i am real mohit",
        "id2":"i am id 4"
      }
    },
    "hji":{
      "mohit_adss231": {
        "id1":"i am id 5",
        "identity" : "i am mohit in real",
        "id2":"i am id 6"
      },
      "mohit": {
        "id7":"i am id 7",
        "identity" : "i am mohit and you?",
        "id8":"i am id 8"
      }
    },
    "c": "d",
    "e": "f"
  },
  "string": "Hello World"
};
我想在javascript中解析完整的JSON,并获取其键以“mohit”开头的值。e、 g.上述输入的输出为:

valueableData:{
  "mohit_ab": {
        "id1":"i am id 1",
        "abcd":{
          "a" :"b",
          "c":"d"
        },
        "who" : "who are you",
        "id2":"i am id 2"
      },
      "mohit_231abcd": {
        "id1":"i am id 3",
        "identity" : "i am real mohit",
        "id2":"i am id 4"
      },
      "mohit_adss231": {
        "id1":"i am id 5",
        "identity" : "i am mohit in real",
        "id2":"i am id 6"
      },
      "mohit": {
        "id7":"i am id 7",
        "identity" : "i am mohit and you?",
        "id8":"i am id 8"
      }
}

请向我推荐实现此目标的简单方法。

您可以使用for循环

var results = [];
for (var key in valueableData)
{
    if ( key.indexOf("mohit") == 0 )
      results.push(valueableData[key]);
}

结果数组将包含匹配的对象。

您在自己的答案中使用的递归方法是一种很好的通用解决方案,始终有效。
但它完全遍历源对象,因此如果有大量嵌套子对象,可能会影响性能

使用下面的解决方案,整个源对象也会被完全遍历,但工作是由JS内部完成的,速度更快。
此外,代码更轻巧,可读性更强

var数据={
“数组”:[
1.
2.
3.
],
“布尔”:真,
“空”:空,
“数字”:123,
“对象”:{
“a”:“b”,
“abc”:{
“mohit_ab”:{
“id1”:“我是id1”,
“abcd”:{
“a”:“b”,
“c”:“d”
},
“谁”:“你是谁”,
“id2”:“我是id2”
},
“mohit_231; abcd”:{
“id1”:“我是ID3”,
“身份”:“我是真正的莫希特人”,
“id2”:“我是ID4”
}
},
“hji”:{
“mohit_adss231”:{
“id1”:“我是ID5”,
“身份”:“我是真实的莫希特”,
“id2”:“我是ID6”
},
“莫希特”:{
“id7”:“我是id7”,
“身份”:“我是莫希特,你呢?”,
“id8”:“我是id8”
}
},
“c”:“d”,
“e”:“f”
},
“字符串”:“你好,世界”
};
var valuableData={};
parse(JSON.stringify(数据)、函数(键、值){
如果(键substr(0,5)='mohit'){
valuableData[键]=值;
}
返回值;
});
文件。写入(‘有价值的数据:’);
for(var键输入valuableData){
document.write(“
”+key+”:“+JSON.stringify(valuableData[key]);
}
我为此制作了一个函数:

var valueAbleData = {};
  this.add = function(value) {
      for (var key in value){
            if(key.indexOf("mohit") > -1){
                valueAbleData[key] =  value[key];
            }
            else if(value[key] !== null && typeof value[key] === 'object'){
                this.add(value[key]);
            }
            }
    };

如果有人能提供更好的答案,请发布。:)

这种方法只有在我们有相同级别的数据时才有效,但我的数据是分层的。它只会在顶层循环。嘿,谢谢你的评论。我是javascript新手,你能告诉我如何在数据中迭代搜索以获得这些键的值吗?@MohitJain Uh。。。对不起,当我意识到我的错误与其他回答者的错误相同时,我正准备完成我对你评论的回答;没有注意到不同的层次。所以目前我的答案没有帮助!尽管如此,我还是觉得这个问题很有趣,所以我将尝试给出一个功能性的答案。。。但只有明天,因为现在对我来说是早上5点:)当然没有问题。请尝试一下,有时间给我答案。谢谢…-)我回答了我的问题,请验证一下。@MohitJain从你最初的问题中,我想象你认为你已经得到了一个递归方法,但正在寻找更简洁的方法:这就是为什么我发布了我的第一个答案,但那是错误的。事实上,我以一个很好的答案结尾:看看我编辑过的答案。关于你自己的答案,请看我在下面的评论。正如我在自己的回答中所说的,我同意这是一个好方法(使用递归总是几乎所有问题的最终解决方案),但如果应用于大数据源,则可能有害。因此,当另一个可用时,它会更好。这里我只注意到两点:1)如果我遗漏了一些微妙的东西,我不理解你的
这个
:你可能只是有
函数add(value)
;2) 使用
key.indexOf('mohit')>-1
您还可以选择
foobar mohit
等键!所以你最好做
==0
。对于你的两点回答:1)这只是本地系统上的演示功能,添加(值)和这个。我会在最后确定答案后更改它。2) 谢谢你的indexof('mohit'),我将把它改为0。