在javascript中递归地从数组中提取值

时间:2014-07-25 17:18:31

标签: javascript recursion

我想以递归方式提取此结构中的文件。我已经完成了第一级,但无法继续进行。

var DirectoryTree = {
    dir: 'project1',
    files: [
        'proj.config', {
            dir: 'src',
            files: [
                'name.htm',
                'dept.htm',
                'salary.htm', {
                    dir: 'scripts',
                    files: [
                        'name.js',
                        'dept.js',
                        'salary.js'
                    ]
                }
            ]
        }, {
            dir: 'project2',
            files: [
                'proj.config', {
                    dir: 'src',
                    files: [
                        'name.htm',
                        'dept.htm',
                        'salary.htm', {
                            dir: 'scripts',
                            files: [
                                'name.js',
                                'dept.js',
                                'salary.js'
                            ]
                        }
                    ]
                }
            ]
        }
    ]
};

以下是我现在的代码。我有点被困在这里。你能帮我从下一级获取数据。

function listFiles(dirTree, subFolder){
    var fList=[];
    if(dirTree.files){
        for (var i=0;i<dirTree.files.length;i++){
            if(typeof dirTree.files[i] === 'string'){
                fList.push(dirTree.files[i]);
            }
        }
    }
    if(dirTree.dir){
        return(listFiles(dirTree.dir, subFolder));
    }
    return fList;
}

2 个答案:

答案 0 :(得分:1)

您可以递归执行此操作,例如

function getFiles(currentObject, result) {
    var type = Object.prototype.toString.call(currentObject),
        idx;
    if (type === "[object Object]") {
        for (idx in currentObject) {
            if (currentObject.hasOwnProperty(idx) && idx === "files") {
                currentObject[idx].forEach(function(object) {
                    getFiles(object, result);
                });
            }
        }
    } else if (type === "[object Array]") {
        currentObject.forEach(function(object) {
            getFiles(object, result);
        });
    } else if (type === "[object String]") {
        result.push(currentObject);
    }
    return result;
}

console.log(getFiles(DirectoryTree, []))

<强>输出

[ 'proj.config',
  'name.htm',
  'dept.htm',
  'salary.htm',
  'name.js',
  'dept.js',
  'salary.js',
  'proj.config',
  'name.htm',
  'dept.htm',
  'salary.htm',
  'name.js',
  'dept.js',
  'salary.js' ]

答案 1 :(得分:0)

我今天回答了类似的问题,并使用一些下划线功能解决了这个问题 您的示例的格式非常奇怪,但我建议再次使用递归函数进行此类读取:

function recursiveFuntion(collection){
    collection.forEach(function(model) { 
        //console.log(model.files); --> Or do whatever you need 
        if(model.files.length > 0){ 
            recursiveFunction(model); 
        }; 
     }); 
}; 

recursiveFuntion(DirectoryTree.files); 

递归函数的好处是它是动态的 由于您不使用数组但使用对象,因此您需要自定义此代码 但这是基本原则。