是的,这个问题已经被回答了很多次了,相信我,我在互联网上搜索了它。但是,经过相当长的时间,我还没有找到一个好的解决方案。
我的问题如下:
想象一下一个具有以下结构的数组:
[
[ 'helpers', 'ConfigHelper.java' ],
[ 'helpers', 'GenerateRandomString.java' ],
[ 'helpers', 'package-info.java' ],
[ 'helpers', 'ScreenshotHelper.java' ],
[ 'pages', 'LoginPage.java' ],
[ 'pages', 'package-info.java' ],
[ 'pages', 'tests', 'LoginPageTest.java' ],
[ 'pages', 'tests', 'package-info.java' ],
[ 'pages', 'util', 'package-info.java' ],
[ 'pages', 'util', 'PageObject.java' ],
[ 'pages', 'util', 'PageObjectTest.java' ],
[ 'pages', 'util', 'PrimaryMethods.java' ],
[ 'webDriverSetup', 'browserDriverFactories', 'ChromeDriverFactory.java'],
]
Run Code Online (Sandbox Code Playgroud)
您可以清楚地看到值的重复项。我想要完成的是这样的嵌套对象:
{
helpers: {
"ConfigHelper.java": "",
"GenerateRandomString.java": "",
"package-info.java": ""
},
pages: {
"LoginPage.java": "",
"package-info.java": "",
tests: {
"LoginPageTest.java": "",
"package-info.java": ""
},
util: {
"package-info.java": "",
"PageObject.java": "",
"PageObjectTest.java": "",
"PrimaryMethods.java": ""
}
},
webDriverSetup: {
browserDriverFactories: {
"ChromeDriverFactory.java": ""
}
}
}
Run Code Online (Sandbox Code Playgroud)
因此,每个数组值基本上都是对象的另一层,最后一个对象除外,后者仅将一个字符串作为其值。
一种有前途的方法将是array.reduce()这样的:
let arrays = [
[ 'helpers', 'ConfigHelper.java' ],
[ 'helpers', 'GenerateRandomString.java' ],
[ 'helpers', 'package-info.java' ],
[ 'helpers', 'ScreenshotHelper.java' ],
[ 'pages', 'LoginPage.java' ],
[ 'pages', 'package-info.java' ],
[ 'pages', 'tests', 'LoginPageTest.java' ],
[ 'pages', 'tests', 'package-info.java' ],
[ 'pages', 'util', 'package-info.java' ],
[ 'pages', 'util', 'PageObject.java' ],
[ 'pages', 'util', 'PageObjectTest.java' ],
[ 'pages', 'util', 'PrimaryMethods.java' ],
[ 'webDriverSetup', 'browserDriverFactories', 'ChromeDriverFactory.java'],
];
let treeView = {};
arrays.forEach(array => {
array.reduce(function(o, key) {
return o[key] = {};
}, treeView);
});
console.log(treeView);Run Code Online (Sandbox Code Playgroud)
但是,显然它将始终覆盖值,因此最后我将收到一个不完整的对象。
我的问题是:
如何编辑功能,以便获得完整的对象?
或有
什么替代品array.reduce()?
Nin*_*olz 11
您可以保存最后一个值,以供以后使用此值作为空字符串的键,其余用于创建嵌套对象。
let arrays = [['helpers', 'ConfigHelper.java'], ['helpers', 'GenerateRandomString.java'], ['helpers', 'package-info.java'], ['helpers', 'ScreenshotHelper.java'], ['pages', 'LoginPage.java'], ['pages', 'package-info.java'], ['pages', 'tests', 'LoginPageTest.java'], ['pages', 'tests', 'package-info.java'], ['pages', 'util', 'package-info.java'], ['pages', 'util', 'PageObject.java'], ['pages', 'util', 'PageObjectTest.java'], ['pages', 'util', 'PrimaryMethods.java'], ['webDriverSetup', 'browserDriverFactories', 'ChromeDriverFactory.java']],
treeView = arrays.reduce((tree, [...array]) => {
var last = array.pop();
array.reduce((o, k) => o[k] = o[k] || {}, tree)[last] = '';
return tree;
}, {});
console.log(treeView);Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }Run Code Online (Sandbox Code Playgroud)