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

Build string from complex nested object values in Javascript

本文关键字:对象 构建 字符串 嵌套 复杂 Javascript      更新时间:2023-09-26

我有以下输入。

    [{ 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'这样的字符串是可能的。

所以这个例子的最终结果应该是:

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

我当前的解决方案实际上不起作用。实现此目的的最佳和性能最高的解决方案是什么?提前感谢!

你可以使用递归函数,像这样

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' ]

你可以使用循环:

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/