【问题标题】:Recursively search JSON string dictionaries for all values with key value pair in "name" [duplicate]递归搜索 JSON 字符串字典以查找“名称”中具有键值对的所有值 [重复]
【发布时间】:2014-01-03 21:56:43
【问题描述】:

更新:

更新小提琴: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);
        });
}

感谢大家的cmets和建议。

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

我在下面有一个 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"
}
]

我需要得到:

约翰 安妮 乔 鲍勃 账单 吉姆

【问题讨论】:

  • 你没有在你的小提琴上做任何努力。由于 json 字符串存在多个问题,您目前遇到语法错误 - 您需要在整个字符串之外使用单引号,这有助于将所有内容都放在一行中,否则您必须处理 end-of-线路问题。到目前为止,我已经更新了fiddle 并添加了JSON.parse 以将其恢复为真实对象,但是现在您必须进行一些编码。 :-P
  • 自从那个错误之后我改变了我的小提琴两次。我不再明白了,我开始编写代码。我寻求有关递归代码的帮助..如果可能的话..如果没有,别担心,我最终会解决的。谢谢。

标签: javascript jquery json angularjs recursion


【解决方案1】:

你可以试试这个:

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

【讨论】:

  • 非常感谢。我会看看并根据我的需要进行调整。
【解决方案2】:

正如 cmets 中所述,您可能应该证明在寻求帮助之前您已经付出了更多的努力,但是在长时间远离代码之后,我认为这是一个小小的热身练习。应该这样做:

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。

【讨论】:

  • 谢谢。我刚刚意识到我没有更新我改变的小提琴。坦率地说,我不太了解所有的大惊小怪,但我接受了。如果人们不想提供帮助,他们就不必提供帮助。我每天有 16 个小时的练习来编写各种代码,而 javascript 并不是我的强项,坦率地说,我既没有预料到快速浏览,也无法集中精力以足够快的速度处理问题以满足某人的紧迫感。无论哪种方式,我都非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-09
  • 2021-02-20
  • 2018-12-07
  • 2012-10-19
  • 2017-12-02
  • 2017-04-14
相关资源
最近更新 更多