Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Angulajs在嵌套数组中动态添加子级_Javascript_Arrays_Angularjs_Nested - Fatal编程技术网

Javascript 使用Angulajs在嵌套数组中动态添加子级

Javascript 使用Angulajs在嵌套数组中动态添加子级,javascript,arrays,angularjs,nested,Javascript,Arrays,Angularjs,Nested,我有一个angularjs数组 $scope.structure = { folders: [ { name: 'Folder 1', files: [{ name: 'File 1.jpg' }, { name: 'File 2.png' }], folders: [ { name: 'Subfolder 1', files: [{ name: 'Subfile 1.t

我有一个angularjs数组

$scope.structure =
{
  folders:  [
              { name: 'Folder 1', files: [{ name: 'File 1.jpg' }, { name: 'File 2.png' }], folders:
                      [
                        { name: 'Subfolder 1', files: [{ name: 'Subfile 1.txt' }], folders:[] },
                        { name: 'Subfolder 2', files:[], folders:[] },
                        { name: 'Subfolder 3', files:[], folders:[] }
                    ]},
              { name: 'Folder 2', files:[], folders:[] }
            ],
  files:    [
              { name: 'File 1.gif' },
              { name: 'File 2.gif' }
            ]
};
结构如下:

Root
--Folder 1
----Subfolder 1
------Subfile 1.txt
----Subfolder 2
----Subfolder 3
----File 1.jpg
----File 2.png
--Folder 2
--File 1.gif
--File 2.gif
现在,我想在现有文件夹中添加其他文件夹和文件,例如,现有文件夹“子文件夹2”下的文件夹“新建文件夹”

我可以通过以下功能手动执行此操作:

$scope.structure.folders[0].folders[1].folders.push({ name: 'New Folder', files:[], folders:[] });
但是现在我想动态地完成它,只需给出我要添加的文件夹的名称。我需要迭代孔数组并在名称后搜索

但是,如何在阵列中确定适当的位置,以便在以后添加文件夹

如果有人能帮助我,那就太好了

非常感谢


Nico

问题是它是一个嵌套列表,其中一个父项与其子项相似,那么这些子项就是其子项的父项。。。这可能会很深

我建议这样做:

如果您喜欢Vanilla JS,您可以编写一个递归函数来迭代文件夹中的文件夹,并执行您需要的任何操作:)下面是一个演示递归的快速示例

var树={
名称:‘A’,
文件夹:[
{
名称:‘B’,
文件夹:[]
},
{
名称:‘C’,
文件夹:[]
}
]
};
函数findFolder(文件夹、名称){
var i;
var匹配;
如果(folder.name==名称){
返回文件夹;
}否则{
对于(i=0;i
问题是,它是一个嵌套列表,其中一个父项与其子项相似,那么这些子项就是其子项的父项。。。这可能会很深

我建议这样做:

如果您喜欢Vanilla JS,您可以编写一个递归函数来迭代文件夹中的文件夹,并执行您需要的任何操作:)下面是一个演示递归的快速示例

var树={
名称:‘A’,
文件夹:[
{
名称:‘B’,
文件夹:[]
},
{
名称:‘C’,
文件夹:[]
}
]
};
函数findFolder(文件夹、名称){
var i;
var匹配;
如果(folder.name==名称){
返回文件夹;
}否则{
对于(i=0;i
我尝试动态设置对象。但我目前找不到最佳的添加方式。坦率地说,我喜欢你的问题。我试着去寻找

/**
*由sherali于2015年8月30日创作。
*/
变量帮助程序={
isEmpty:函数(obj){
return!obj | | obj==null | | obj==undefined | | Array.isArray(obj)和&obj.length==0;
},
clearArray:函数(arr){
if(arr&&Array.isArray(arr)){
arr.length=0;
}
},
pushArray:函数(arr1、arr2){
if(arr1&&arr2&&Array.isArray(arr1)){
arr1.push.apply(arr1,Array.isArray(arr2)?arr2:[arr2]);
}
},
setArray:函数(arr1、arr2){
这个.clearArray(arr1);
这个.pushArray(arr1,arr2);
}
};
函数FileOrFolder(名称、文件夹数组、文件数组、格式、isFile、大小){
变量名,
_文件夹=[],
_文件=[],
_大小=0,
_格式=空,
_isFile=false,
_json={};
var self=这个;
对象。定义属性(此{
姓名:{
get:function(){
返回_name;
},
设置:功能(val){
_name=val;
},
可枚举:true
},
文件夹:{
get:function(){
返回_文件夹;
},
设置:功能(val){
setArray(_folders,val);
},
可枚举:true
},
档案:{
get:function(){
返回_文件;
},
设置:功能(val){
setArray(_文件,val);
},
可枚举:true
},
尺寸:{
get:function(){
返回大小;
},
设置:功能(val){
_size=Helper.isEmpty(val)?0:val;
},
可枚举:true
},
格式:{
get:function(){
返回格式;
},
设置:功能(val){
_格式=val;
},
可枚举:true
},
isFile:{
get:function(){
返回ISU文件;
},
设置:功能(val){
_isFile=val;
},
可枚举:true
},
json:{
get:function(){
返回json;
},
设置:功能(val){
_json=val;
},
可枚举:true
}
});
this.addFileOrFolder=函数(项,isFile){
Object.keys(item.json).forEach(函数(key,i,obj){
if(isFile){
pushArray(_文件,项);
_json[name].files[key]=item.json[
$scope.structure.folders[0].folders[1].folders.push({ name: 'New Folder', files:[], folders:[] });
var tree = {
    name: 'A', 
    folders: [
        {
            name: 'B',
            folders: []
        },
        {
            name: 'C',
            folders: []
        }
    ]
};

function findFolder(folder, name) {
    var i;
    var match;

    if(folder.name === name) {
        return folder;
    } else {
        for(i = 0; i < folder.folders.length; i++) {
            match = findFolder(folder.folders[i], name);
            if(match) {
                return folder.folders[i];
            }
        }
    }
}

findFolder(tree, 'C').folders.push({name: 'newFolder', folders: []});
console.log(tree); // There is a newFolder under C.