我有一大堆从AWS S3中格式化的字符串:
1g2LNBuUNMBVppc311kZ / 1Q77N7KbUPOIOXUEJsd.xml
我想将此转换为具有文件夹名称的对象数组(字符串的第一部分,直到/)和每个对象的文件数组。文件名是斜杠后字符串的一部分。实施例
[ { FolderName: '1g2LNBuUNMBVppc311kZ', Files: [123.xml, aba.xml] }, {} ]
关于如何做到这一点的任何建议。
答案 0 :(得分:1)
试试这个:
var array = [
"1g2LNBuUNMBVppc311kZ / 1Q77N7KbUPOIOXUEJsd.xml",
"1g2LNBuUNMBVppc311kZ / foo.xml",
"foo / bar.xml"
];
var output = array.reduce(function(array, field) {
var found = null;
var fields = field.split(/\s*\/\s*/);
// search for folder
for (var i = 0; i < array.length; ++i) {
if (array[i].folderName == fields[0]) {
found = array[i];
break;
}
}
if (found) {
// found folder push to files
found.files.push(fields[1]);
} else {
// new folder
array.push({folderName: fields[0], files: [fields[1]]});
}
return array;
}, []);
alert(JSON.stringify(output));
&#13;
答案 1 :(得分:1)
将数组减少为对象。首先锻炼分裂逻辑的辅助函数:
// convert String "path / file" into ["path", "file"]
function splitPath(string) {
var parts = string.split('/');
return [parts[0].trim(), parts.slice(1).join('/').trim()];
}
然后使用reduce()
转换为对象:
function toObject(data) {
return data.reduce(function(memo, entry) {
var parts = splitPath(entry);
var folder = memo[parts[0]] || [];
folder.push(parts[1]);
memo[parts[0]] = folder;
return memo;
}, {});
}
因为你要求一组对象,所以如何转换它:
function toArrayOfObjects(folders) {
Object.keys(folders).map(function(folderName) {
return {
FolderName: folderName,
Files: folders[folderName]
};
});
}