递归搜索JSON字符串字典,查找“name”中具有键值对的所有值

时间:2014-01-03 21:56:44

标签: javascript jquery json angularjs recursion

更新

更新小提琴:http://jsfiddle.net/Y2xFV/10/

  

我接受了以下其中一个答案,尽管两者都令人满意。我选择的那个更接近我自己的方向。然而,所提供的解决方案都没有完全符合我的需要。

在实践中,我最终编写了适合我实际需要的angular-js函数,看起来像这样..

function getNames(obj) {
    if(obj.attrs) {
        console.log(obj.attrs.name);
        // expressions that utilize key pair values..
    }
    if(!obj.children) {
        return;
    }
        angular.forEach(obj.children, function(o) {
            getNames(o);
        });
}

感谢大家的意见和建议。

=========================================

我下面有一个JSON字符串,我必须获得所有名称的值。我知道有一种递归方式,但我需要帮助。我搜索了堆栈的解决方案,但没有发现任何直接解决它的问题。

我在工作。我会尽快更新小提琴。我的时间非常有限,有时我不会马上回到我的堆栈。如果这对某人来说是一个问题,我道歉。我不需要毫秒的答案,我接受建设性的批评:)。一旦我真正设法找到小提琴,我就会发布问题。

[
{
    "name": "john",
    "surname": "doe",
    "children": [
        {
            "name": "anne",
            "surname": "peters"
        }
    ]
},
{
    "name": "joe",
    "surname": "doe",
    "children": [
        {
            "name": "bob",
            "surname": "peters",
            "children": [
                {
                    "name": "bill",
                    "surname": "peters"
                }
            ]
        }
    ]
},
{
    "name": "jim",
    "surname": "doe"
}
]

我需要得到:

约翰 安妮 乔 短发 法案 吉姆

2 个答案:

答案 0 :(得分:3)

你可以试试这个:

function getNames(obj, list) {
  if (!obj) return list;
  if (obj instanceof Array) {
    for (var i in obj) {
        list = list.concat(getNames(obj[i], []));
    }
    return list;
  }
  if (obj.name) list.push(obj.name);
  if (obj.children) return getNames(obj.children, list);
  return list;
}
// Outputs a list of names
console.log(getNames(JSON.parse(json), []));

FIDDLE

答案 1 :(得分:1)

正如评论中所说,你应该证明你在寻求帮助之前已经付出了更多的努力,但是经过长时间的脱离代码我觉得这是一个小小的热身练习。像下面这样的东西应该这样做:

function getChildren(children) {
    var str = '';
    for (var i = 0, child; i < children.length; i ++) {
        child = children[i]; 
        str += ' ' + child.name;
        if (child.children) {
            str += getChildren(child.children);   
        }
    }
    return str;
}

var names = getChildren(JSON.parse(json));
console.log(names);

感谢Scott Mermelstein提供了一个更好的小提琴作为起点。工作fiddle here