2015-01-07 48 views
1

我有以下输入。从Javascript中的复杂嵌套对象值生成字符串

[{ name: 'modules', 
     children: [ { name: 'home', children: [], allowed: true } ], 
     allowed: true }, 

    { name: 'modules', 
     children: 
     [ { name: 'new', children: [], allowed: true }, 
      { name: 'all', children: [], allowed: true } ], 
     allowed: true }, 

    { name: 'groups', 
     children: 
     [ { name: 'new', children: [], allowed: true }, 
      { name: 'all', children: [], allowed: true } ], 
     allowed: true }, 

    { name: 'users', 
     children: 
     [ { name: 'new', children: [], allowed: true }, 
      { name: 'all', children: [], allowed: true } ], 
     allowed: true }, 

    { name: 'settings', 
     children: 
     [ { name: 'generally', children: [], allowed: true }, 
      { name: 'personal', children: [], allowed: true } ], 
     allowed: true }] 

我想从这样的值建立字符串:name.children.name.children等等。我需要一切可能的组合。嵌套可以是无止境的。所以像'test.test1.test2.test3'这样的字符串是可能的。

这样的例子的endresult应该是:

'modules.home' 
'modules.new' 
'modules.all' 
'groups.new' 
'groups.all' 
'users.new' 
'users.all' 
'settings.generally' 
'settings.personal' 

我现在的解决方案并没有真正的工作.. 这是实现这一目标的最好和最高效的解决方案?提前致谢!

回答

3

您可以使用一个递归函数,这样

function recursiveNamer(currentList, currentNameString, result) { 

    var name = currentNameString === "" ? "" : currentNameString + "."; 

    currentList.forEach(function(currentObject) { 

     if (currentObject.children.length === 0) { 

      result.push(name + currentObject.name); 

     } else { 

      recursiveNamer(currentObject.children, name + currentObject.name, result); 

     } 

    }); 

    return result; 
} 

console.log(recursiveNamer(inputData, "", [])); 

其结果将是

[ 'modules.home', 
    'modules.new', 
    'modules.all', 
    'groups.new', 
    'groups.all', 
    'users.new', 
    'users.all', 
    'settings.generally', 
    'settings.personal' ] 
0

你可以使用一个循环:

for(var i=0;i<data.length;i++){ 
    for(var e=0;e<data[i].children.length;e++){ 
     console.log(data[i].name+'.'+data[i].children[e].name); 
    } 
} 

http://jsfiddle.net/6pcjvvv0/

+0

'嵌套可以是无止境的。所以像'test.test1.test2.test3'这样的字符串是可能的。 ' – thefourtheye

+0

是的,只是注意到了,我认为它只有1层深 –

+0

看起来你的工作会很好,有一个upvote –

相关问题