简体   繁体   English

在Javascript中从复杂的嵌套对象值构建字符串

[英]Build string from complex nested object values in Javascript

I have the following input. 我有以下输入。

    [{ 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 }]

I would like to build string from the values like this: name.children.name.children and so on. 我想从这样的值构建字符串:name.children.name.children等。 I need every possible combination. 我需要一切可能的组合。 The nesting can be endless. 筑巢可以是无穷无尽的。 So a string like 'test.test1.test2.test3' is possible. 所以像'test.test1.test2.test3'这样的字符串是可能的。

So the endresult of the example should be: 所以示例的结果应该是:

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

My current solution does not really work.. Which is the best and most performant solution to achieve this? 我目前的解决方案并没有真正起作用..哪个是实现这一目标的最佳和最高效的解决方案? Thanks in advance! 提前致谢!

You can use a recursive function, like this 您可以使用递归函数,如下所示

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, "", []));

And the result would be 结果就是

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

You could use a loop: 你可以使用一个循环:

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/ http://jsfiddle.net/6pcjvvv0/

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM