2017-09-27 37 views
1

我有一个奇怪的要求,通过值从JSON对象获取值,例如在下面的json对象中,有两个数组在那里,如果我传递值作为史蒂夫而不是像史蒂夫乔恩,而不是像全价值如何循环我的整个json对象,并找到整个json对象中的匹配对象。 我的json对象非常大,请给我建议任何好的方法来循环整个对象而不会导致性能下降。我已经检查JSONPath表达,但它不是事先如何获取具有指定文本/字符的JSON值NOT键值

工作

感谢

grouped_people: { 
    'friends': [ 
     {name: 'Steve Jon', country: 'NZ'}, 
     {name: 'Jane Ken', country: 'US'}, 
     {name: 'Mike Jhon', country: 'AU'}, 
     {name: 'Mary Mani', country: 'NZ'}, 
    ], 
    'enemies': [ 
     {name: 'Evil Steve', country: 'AU'}, 
     {name: 'Betty', country: 'NZ'}, 
    ] 
} 
+0

对于g ood旧时尚for/foreach循环 – madalinivascu

+0

@madalinivascu但是会杀死性能..如果你的json数据很大,请给出任何例子 –

+0

然后根据提供的名称创建一个更多的api来获取数据。创建一个get方法并将名称作为参数传递,并使用该方法搜索数据库并返回结果。 –

回答

0

可以使用recursive功能找到它包含如下的给定值object

var grouped_people = { 
 
    'friends': [{ 
 
     name: 'Steve Jon', 
 
     country: 'NZ' 
 
    }, 
 
    { 
 
     name: 'Jane Ken', 
 
     country: 'US' 
 
    }, 
 
    { 
 
     name: 'Mike Jhon', 
 
     country: 'AU' 
 
    }, 
 
    { 
 
     name: 'Mary Mani', 
 
     country: 'NZ' 
 
    }, 
 
    ], 
 
    'enemies': [{ 
 
     name: 'Evil steve', 
 
     country: 'AU' 
 
    }, 
 
    { 
 
     name: 'Betty', 
 
     country: 'NZ' 
 
    }, 
 
    ] 
 
}; 
 

 
//Recursive function to search text in the object 
 
function findObject(obj, text, callback) { 
 
    for (var k in obj) { 
 
    if (typeof obj[k] == "object" && obj[k] !== null) { 
 
     findObject(obj[k], text, callback); 
 
    } else { 
 
     if (obj[k].toLowerCase().indexOf(text.toLowerCase()) !== -1) { 
 
     callback(obj);    
 
     } 
 
    } 
 
    } 
 
} 
 

 

 
findObject(grouped_people, "Steve", function(obj) { 
 
    //All matched objects will return here. 
 
    console.log(obj); 
 
});

+0

看起来不错并且如预期的那样,但挑战会来对于大json对象 –

+0

@MallikarjunHampannavar没有其他的解决方案,而不是通过整个对象,因为你需要该对象作为输出。 :( – Thusitha

+0

是的,你是正确的兄弟..我检查这个我的大对象,让我们看看性能 –

0

我觉得冲击功能(从谷歌的角度项目)可能帮助您:

/* Seach in Object */ 

var comparator = function(obj, text) { 
if (obj && text && typeof obj === 'object' && typeof text === 'object') { 
    for (var objKey in obj) { 
     if (objKey.charAt(0) !== '$' && hasOwnProperty.call(obj, objKey) && 
       comparator(obj[objKey], text[objKey])) { 
      return true; 
     } 
    } 
    return false; 
} 
text = ('' + text).toLowerCase(); 
return ('' + obj).toLowerCase().indexOf(text) > -1; 
}; 

var search = function(obj, text) { 
if (typeof text == 'string' && text.charAt(0) === '!') { 
    return !search(obj, text.substr(1)); 
} 
switch (typeof obj) { 
    case "boolean": 
    case "number": 
    case "string": 
     return comparator(obj, text); 
    case "object": 
     switch (typeof text) { 
      case "object": 
       return comparator(obj, text); 
      default: 
       for (var objKey in obj) { 
        if (objKey.charAt(0) !== '$' && search(obj[objKey], text)) { 
         return true; 
        } 
       } 
       break; 
     } 
     return false; 
    case "array": 
     for (var i = 0; i < obj.length; i++) { 
      if (search(obj[i], text)) { 
       return true; 
      } 
     } 
     return false; 
    default: 
     return false; 
} 
}; 

this post

0

根据你的对象,你可以这样做:

for (var key in obj) { 
    if (obj.hasOwnProperty(key)) { 
    for (var subKey in obj[key]) {   
    if(obj[key][subKey].name.toLowerCase().search(keyword)!=-1){ 
     alert('The keyword exist') 
     return true; 
    } 
    }  

    } 
    alert('not found'); 
    return false; 
} 

我假设你通过一个形式通过关键字,例如,你可以将它传递给方法如下图所示:

<input type="text" id="keyword" placeholder="Enter Keyword" /> 
<input type="button" onclick="find(keyword.value)" value="find" /> 

我做了一个例子,你在这里(更新不区分大小写搜索):

https://jsfiddle.net/emilvr/9o8s2680/2/

+0

好的,但是有感觉的 –

+0

好吧,我们只需要使用toLowerCase()来覆盖所有的,我更新代码;) –