2017-09-27 69 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()來覆蓋所有的,我更新代碼;) –