更新
更新小提琴: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"
}
]
我需要得到:
约翰 安妮 乔 短发 法案 吉姆
答案 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), []));
答案 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。