我得到了一个json:
var jsonData = {
"id": 0,
"content": "abc",
"children" : [{
"id": 1,
"content": "efg",
"children" : []
}
{
"id": 2,
"content": "hij",
"children" : []
}
]}
我只想通过搜索正确的密钥和值来让孩子成为json的一部分。 像
if(id == 2)
然后我可以得到jsonData.children[1]
,然后我可以对我得到的这个对象做其他事情。
它就像一种更有效的方式,如indexOf()
它让我想起在Java和C#中使用Hashtable。好吧,javascript似乎没有哈希表。
那么,有什么方法可以解决这个问题吗?
答案 0 :(得分:1)
您可以使用filter
:
var idToMatch = 2;
var matches = jsonData.children.filter(function (el) {
return el.id === idToMatch;
});
更新:添加了递归案例
要将其扩展为递归情况,至少从上面的@elclanrs的答案中提供一种更优雅方法的替代方法(这是最好的答案),但下面的内容仅为了完整性而添加。
var matches = [];
function findMatches(children, idToMatch) {
if (children && Array.isArray(children)) {
var newMatches = children.filter(function (el) {
return (el.id === idToMatch);
});
Array.prototype.push.apply(matches, newMatches);
for (var i = 0; i < children.length; i++)
findMatches(children[i].children, idToMatch);
}
}
findMatches(jsonData.children, 3);
console.log(matches);
答案 1 :(得分:1)
您可以使用递归和缩减器:
function find(pred, coll) {
return coll.reduce(function(acc, obj) {
if (pred(obj)) {
return obj
} else if (obj.children.length) {
return find(pred, obj.children)
} else {
return acc
}
},null)
}
find(function(o){return o.id===2}, [jsonData])
//^ {id: 2, content: 'hij', children: []}
如果找不到具有该ID的对象,则它将返回null
。
答案 2 :(得分:0)
Javascript对象默认为Maps。例如,
var child = {}
child[1] = {"id": 1, "content": "efg"}
child[2] = { "id": 2,"content": "hij"}
您可以检索
之类的值var value = child[1].content;
希望这有帮助!
答案 3 :(得分:0)
这可能是一种方式。 它的灵感来自@Jason W,@ Mr.Green和@elclanrs。
我试过这个,但它确实有效。
然而,仍然有一些问题让我感到困惑,为什么它可以像这样工作,我将在稍后发布我的问题。如果你能帮助我,请检查一下。
var dataMap = {};
function matchData (jsonObj) {
dataMap[jsonObj.id] = jsonObj;
if (jsonObj.children.length > 0) {
for (var i = 0; i < jsonObj.children.length; i++) {
dataMap[jsonObj.children[i].id] = jsonObj.children[i];
if (jsonObj.children[i].children > 0) {
matchData(jsonObj.children[i]);
}
}
}
}
matchData(jsonData);
console.log(dataMap[2]);
//you will get "{"id": 2,"content": "hij","children" :[]}