2016-12-13 2 views
0

Я хочу найти объект JSON, чтобы проверить, содержит ли он строковые значения, хранящиеся в массиве. и выяснить родительские элементы.Как выполнить поиск объекта JSON для определенного значения строки?

var searchVal = ['name_1a','name_2y','name_3x']; 

var json = { 
"location": { 
     "title1x": { 
      "1": "name_1x", 
      "2": "name_2x", 
      "3": "name_3x", 
     }, 
     "title2y": { 
      "1": "name_1y", 
      "2": "name_2y", 
      "3": "name_3y", 
     }, 
    } 

    "object": { 
     "title1a": { 
      "1": "name_1z", 
      "2": "name_2z", 
      "3": "name_3z", 
     }, 
     "title2b": { 
      "1": "name_1a", 
      "2": "name_2a", 
      "3": "name_3a", 
     }, 
    } 
}; 

Я хочу передать результаты в функцию. И разобраться с ними отдельно.

name_1a -> function(title2b, object) 
name_2y -> function(title2y, object) 
name_3x -> function(title1x, location) etc. 

. Вот что я пробовал до сих пор. Я не могу показаться, чтобы выяснить, как gothrough объект весь JSON

var searchVal = ['name_1a','name_2y','name_3x']; 
    for (var i=0 ; i < searchVal.length ; i++){ 
    for (var k=0 ; k < ????.length ; k++) 
    { 
     if (json.???????? == searchVal[i]) { 
     results.push(???????); 
     console.log(results); 

     } 
    } 
    } 
+1

JSON не правильный синтаксис – Mahi

+0

Вам нужно сделать рекурсивную функцию – Eric

+0

вы могли бы дать нам ожидаемый выход, соответствующий вход вы дали –

ответ

0

var searchVal = ['name_1a','name_2y','name_3x']; 
 

 
var json = { 
 
"location": { 
 
     "title1x": { 
 
      "1": "name_1x", 
 
      "2": "name_2x", 
 
      "3": "name_3x", 
 
     }, 
 
     "title2y": { 
 
      "1": "name_1y", 
 
      "2": "name_2y", 
 
      "3": "name_3y", 
 
     } 
 
    }, 
 

 
    "object": { 
 
     "title1a": { 
 
      "1": "name_1z", 
 
      "2": "name_2z", 
 
      "3": "name_3z", 
 
     }, 
 
     "title2b": { 
 
      "1": "name_1a", 
 
      "2": "name_2a", 
 
      "3": "name_3a", 
 
     } 
 
    } 
 
}; 
 
var getTitle=function(json,val){ 
 
    for (var key in json) { 
 
    var titles= json[key]; 
 
    for (var tit in titles) { 
 
     var names=titles[tit]; 
 
     for (var name in names) { 
 
     var string=names[name]; 
 
     if(string===val) 
 
      return tit; 
 
     } 
 
    } 
 
} 
 
} 
 

 
searchVal.forEach(function(valToSearch){ 
 
    console.log(getTitle(json,valToSearch)); 
 
});

1

с кодом ниже вы можете найти то, что вы ищете рекурсивно:

var json = { 
    "location": { 
     "title1x": { 
      "1": "name_1x", 
      "2": "name_2x", 
      "3": "name_3x", 
     }, 
     "title2y": { 
      "1": "name_1y", 
      "2": "name_2y", 
      "3": "name_3y", 
     }, 
    }, 
    "object": { 
     "title1a": { 
      "1": "name_1z", 
      "2": "name_2z", 
      "3": "name_3z", 
     }, 
     "title2b": { 
      "1": "name_1a", 
      "2": "name_2a", 
      "3": "name_3a", 
     }, 
    } 
}; 

var searchTest = function(varToSearch, jsonData) { 

    for (var key in jsonData) { 
     if(typeof(jsonData[key]) === 'object') { 
      searchTest(varToSearch, jsonData[key]); 
     } else { 
      if(jsonData[key] == varToSearch) { 
       console.log(jsonData[key]); 
      } 
     } 
    } 

} 

searchTest('name_1a', json); 

Код:

get data from dynamic key value in json

get value from json with dynamic key

https://trinitytuts.com/tips/get-dynamic-keys-from-json-data/

How do I enumerate the properties of a JavaScript object?

Check if a value is an object in JavaScript

1

А что-то вроде этого:

var json = { 
 
    "location": { 
 
    "title1x": { 
 
     "1": "name_1x", 
 
     "2": "name_2x", 
 
     "3": "name_3x", 
 
    }, 
 
    "title2y": { 
 
     "1": "name_1y", 
 
     "2": "name_2y", 
 
     "3": "name_3y", 
 
    }, 
 
    }, 
 
    "object": { 
 
    "title1a": { 
 
     "1": "name_1z", 
 
     "2": "name_2z", 
 
     "3": "name_3z", 
 
    }, 
 
    "title2b": { 
 
     "1": "name_1a", 
 
     "2": "name_2a", 
 
     "3": "name_3a", 
 
     "foo": [{ 
 
     "x": "aaa", 
 
     "y": "bbb", 
 
     "z": { 
 
      "k": "name_3y" 
 
     } 
 
     }, { 
 
     "x": "aaa", 
 
     "y": "bbb", 
 
     "z": { 
 
      "k": "name_3y", 
 
      "bar": [{ 
 
      "op": "test", 
 
      "fooAgain": { 
 
       "x": "name_3y" 
 
      } 
 
      }] 
 
     } 
 
     }] 
 
    }, 
 
    } 
 
}; 
 

 
function search(what, where) { 
 

 
    var results = []; 
 
    var parentStack = []; 
 

 
    var searchR = function(what, where) { 
 

 
    if (typeof where == "object") { 
 
     parentStack.push(where); 
 
     for (key in where) { 
 
     searchR(what, where[key]); 
 
     }; 
 
     parentStack.pop(); 
 
    } else { 
 
     // here comes your search 
 
     if (what === where) { 
 
     results.push({ 
 
      parent: parentStack[parentStack.length - 1], 
 
      value: where 
 
     }); 
 
     } 
 
    } 
 

 
    } 
 

 
    searchR(what, where); 
 

 
    return results; 
 

 
} 
 

 
search("name_3y", json).forEach(function(value, key) { 
 

 
    var out = "parent: \n"; 
 

 
    for (key in value.parent) { 
 
    out += " key: " + key + " - value: " + value.parent[key] + "\n"; 
 
    } 
 

 
    out += "\nvalue: " + value.value; 
 

 
    alert(out); 
 

 
});

Функция поиска будет искать значение, точно равное внутри объекта json. Вы можете использовать его для поиска каждого элемента массива, например, просто отредактируйте код. Стопка была необходима, так как нам нужно следить за родителями. Я изменил ваш json, чтобы вставить больше уровней. Значения результатов - это объекты с двумя атрибутами. Я думаю, что с этим вы можете делать то, что вам нужно. Разумеется, вы можете изменить свой код, чтобы использовать регулярные выражения для строк в вашем поиске. Это было бы более мощным.

Смежные вопросы