【发布时间】:2020-08-31 17:23:07
【问题描述】:
在节点中,我试图将 S3 中的一组对象(对解析的超级烦人的响应)转变为更前端可用的东西。 初始对象格式为:
[
{
Key: 'some/folder/structure/file.jpg',
LastModified: 2020-05-14T02:16:59.000Z,
ETag: '"SomeETag"',
Size: 83630,
StorageClass: 'STANDARD'
}
]
我正在尝试将它变成一个数组,例如:
name: "some"
files: [
{
key: 'some/folder/structure/file.jpg',
name: 'file.jpg',
folder: 'folder',
subfolder: 'structure'
}
]
key 是我需要从 s3 中检索对象的键。 name 是前端显示的文件名。 文件夹最终成为我要在其中显示文件的顶级文件夹。 子文件夹是文件夹和文件名之间的任何内容。
此处理将为 s3 中的每个实际顶级文件夹创建一个对象(示例中为“一些”)。这个对象将有一个名称,以及一个像上面那样的文件对象列表。
这是我的功能:
function processResponse(res) {
var result = [];
res.forEach(item =>{
if(item.Key.slice(-1) === '/') return;
const split = item.Key.split('/');
var obj = {
key: item.Key,
name: split[split.length-1],
folder: split[1],
subfolder: split.length <= 3 ? '' : split.join([2,split.length-2])
}
var index = result.findIndex(x => x.name === split[1])
if(index === -1) {
result = [...result, {
name: split[1],
files: []
}]
index = result.length-1
}
result[index].files = [...result[index].files, obj];
});
console.log(result)
return result;
}
我看到的问题是任何单个文件夹的文件数组。当我控制台记录结果数组时,不是显示每个文件的数据,而是返回如下所示:
[
{
name: 'Forms',
files: [
[Object], [Object],
[Object], [Object],
[Object], [Object],
[Object], [Object],
[Object], [Object],
[Object], [Object]
]
}
]
除了数据丢失之外,似乎也打破了返回前端。如何将实际数据推送到每个文件数组中,以便它可以被 console.log-ed 并正确返回?
奖励:我认为我制作子文件夹字符串的方式是错误的。基本上我想要从 split[2] 到文件之前的最后一个文件夹的任何内容,或者如果 split 的长度仅为 3,则为 ''。
感谢您的帮助!
【问题讨论】:
-
这就是控制台显示深度嵌套对象的方式。
-
使用
console.dir()而不是console.log()。 -
更好的是,使用调试器
-
顺便说一句,
result[index].files = [...result[index].files, obj]可以更简单地写成result[index].files.push(obj) -
使用 |
console.log( JSON.stringify(result,0,2) )
标签: javascript arrays node.js data-manipulation