如何通过Javascript中的keyname和value获取json的子项?

时间:2015-07-09 02:24:33

标签: javascript json hashtable

我得到了一个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似乎没有哈希表。

那么,有什么方法可以解决这个问题吗?

4 个答案:

答案 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);

JS小提琴:http://jsfiddle.net/vafwg3kf/

答案 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" :[]}