在嵌套的对象数组中,使用key 1的值,获取key 2的值



我有一个json文件夹。

folders.json

[
{
"name": "Documents",
"files": [
{
"name": "Quarterly Results",
"type": "Document"
}
]
},
{
"name": "Favourites",
"files": [
{
"name": "Brawl Stars",
"files": [
{
"name": "NS dying in 5 seconds",
"type": "Video"
},
{
"name": "Josiah raping NS",
"type": "Video"
}
]
},
{
"name": "Coding",
"files": [
{
"name": "Coding is so fun",
"type": "Image"
},
{
"name": "I love svelte",
"files": [
{
"name": "REPLs",
"files": [
{
"name": "REPL 1",
"type": "Image"
},
{
"name": "REPL 2",
"type": "Videp"
}
]
},
{
"name": "oh nooo",
"type": "Document"
}
]
}
]
},
{
"name": "Favourites 1",
"type": "Document"
},
{
"name": "Favourites 2",
"type": "Video"
},
{
"name": "Favourites 3",
"type": "Image"
}
]
},
{
"name": "Knowledge Base 1",
"type": "Video"
}
]

假设我有一个文件夹"名称"在folders.json。我想找到里面所有的文件名

例如,给定一个文件夹" favorites ",我想输出:

[{name: 'Brawl Stars', files: Array(2)}, {name: 'Coding', files: Array(2)} {"name": "Favourites 1", "type": "Document"}, {"name": "Favourites 2","type": "Video"},{"name": "Favourites 3", "type": "Image"}]

注意:当filesname在同一个字典中时,称为文件夹

因此,使用key:name的值,输出该嵌套对象数组中files的值。

我已经尝试了以下内容:root.filter(item => item.name === currentFolder).map(item => item.files),其中root是对象的数组,currentFolder是文件夹的"名称";在folder.json。

但是,这只适用于深度为2的文件夹,其中文件夹没有嵌套在其他文件夹中。

我试着寻找其他答案,但所有其他答案只能工作到深度2,因此需要帮助。

我目前使用的是sveltekit框架,而不是jquery。

尝试递归。循环遍历每个文件夹,如果它是我们想要的文件夹,则返回该文件夹。否则,对该文件夹执行相同的过程。就像这样:

function getFolder(folders, name) {
for (const folder of folders) {
// skip if this isn't a folder
if (!folder.files) continue;
// if this folder is what we're looking for, then return
if (folder.name === name) return folder;

// else recurse and return if we get a result
const subsearch = getFolder(folder.files, name);
if (subsearch) return subsearch;
}
// if there's no matches, return null
return null
}
const folders = [{name:"Documents",files:[{name:"Quarterly Results",type:"Document"}]},{name:"Favourites",files:[{name:"Brawl Stars",files:[{name:"NS dying in 5 seconds",type:"Video"},{name:"Josiah raping NS",type:"Video"}]},{name:"Coding",files:[{name:"Coding is so fun",type:"Image"},{name:"I love svelte",files:[{name:"REPLs",files:[{name:"REPL 1",type:"Image"},{name:"REPL 2",type:"Videp"}]},{name:"oh nooo",type:"Document"}]}]},{name:"Favourites 1",type:"Document"},{name:"Favourites 2",type:"Video"},{name:"Favourites 3",type:"Image"}]},{name:"Knowledge Base 1",type:"Video"}];
console.log(getFolder(folders, 'Favourites'))

在搜索多层嵌套数据时需要使用递归。

我在这里找到了一个解决方案

function findNested(obj, key, value) {
// Base case
if (obj[key] === value) {
return obj;
} else {
var keys = Object.keys(obj); // add this line to iterate over the keys
for (var i = 0, len = keys.length; i < len; i++) {
var k = keys[i]; // use this key for iteration, instead of index "i"
// add "obj[k] &&" to ignore null values
if (obj[k] && typeof obj[k] == "object") {
var found = findNested(obj[k], key, value);
if (found) {
// If the object was found in the recursive call, bubble it up.
return found;
}
}
}
}
}

那么你可以这样做:(其中'folders'是你的数据)

findNested(folders, "name", "REPLs").files

最新更新