Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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 用于从文件目录结构创建/数组的函数_Javascript_Arrays_Node.js_Functional Programming - Fatal编程技术网

Javascript 用于从文件目录结构创建/数组的函数

Javascript 用于从文件目录结构创建/数组的函数,javascript,arrays,node.js,functional-programming,Javascript,Arrays,Node.js,Functional Programming,我一直在开发一个函数,该函数将采用相对目录名,递归地遍历该目录及其所有子目录,并创建包括文件在内的整个结构的数组 我从这里做的工作开始: 我正在开发一个独立的应用程序,可以利用ES6/ES7 下面的代码可以工作。然而,我的主要目标是提高我的编码技能,所以我想知道是否有更好的方法?更有效率?更实用 我知道我可以将命名函数直接移动到.map中并使用箭头函数,但我应该这样做吗?在这种情况下,我并没有真正返回任何东西,所以使用更简洁的语法是否不太清晰?事实上,我并没有明确地返回和利用这个返回,而是依赖副

我一直在开发一个函数,该函数将采用相对目录名,递归地遍历该目录及其所有子目录,并创建包括文件在内的整个结构的数组

我从这里做的工作开始:

我正在开发一个独立的应用程序,可以利用ES6/ES7

下面的代码可以工作。然而,我的主要目标是提高我的编码技能,所以我想知道是否有更好的方法?更有效率?更实用

我知道我可以将命名函数直接移动到.map中并使用箭头函数,但我应该这样做吗?在这种情况下,我并没有真正返回任何东西,所以使用更简洁的语法是否不太清晰?事实上,我并没有明确地返回和利用这个返回,而是依赖副作用(?)是不起作用的

const fs = require('fs');
const path = require('path');


function walkSync(dir, array = []) {

  function _process(collectionElement) {

    const nextJoin = path.join(dir, collectionElement);
    array.push(nextJoin.replace(/\\/g, '/'));

    if (fs.statSync(nextJoin).isDirectory()) {

      walkSync(nextJoin, array);

    }

  }

  fs.readdirSync(dir).map(_process);

  return array;

}

console.log(walkSync('directory'));
2017年4月23日编辑

因此,我认为以下内容更实用,更“纯粹”。不确定我是否还能做得更好

const fs = require('fs');
const path = require('path');


// Builds an array of all directories and files
function processDirectory(content, directory, array) {

  const item = path.join(directory, content);

  // reformat for Windows environment
  array.push(item.replace(/\\/g, '/'));

  if (fs.statSync(item).isDirectory()) {

    // eslint-disable-next-line no-use-before-define
    return walkDirectorySync(item, array);

  }

  return array;

}

function walkDirectorySync(directory, array = []) {

  // node reads the directory SYNCHRONOUSLY (maintains order & BLOCKS)
  fs.readdirSync(directory).map(content => processDirectory(content, directory, array));

  return array;

}


console.log(walkDirectorySync('world'));

把lodash模块带到这里。首先,您可以在walkDirectorySync中将映射更改为reduce,并将其传递给一个数组,而不是注入一个数组。其次,您可以curry processDirectory函数,它将允许您将目录curry到processDirectory中,并将curry函数传递给reduce的每个迭代。这将processDirectory转变为一个缩减函数。最后,您可以通过在processDirectory中克隆数组而不修改原始数组来实现更高的纯度——当然,这会降低性能,但这对您来说是可行的

这应该是一种更纯粹的/功能性的方法。我相信总有改进的余地,但希望这能给你一些思考的食物

const fs     = require('fs'),
      lodash = require('lodash'),
      path   = require('path');

function walkDirectorySync(directory) {
  return fs.readdirSync(directory).reduce(processDirectory(directory), []);
}

const processDirectory = lodash.curry(function (directory, accumulator, content) {
  accumulator = accumulator.slice(); // trying to be pure here

  const item = path.join(directory, content).replace(/\\/g, '/'); // reformats for Windows environment

  accumulator.push(item);

  if (fs.statSync(item).isDirectory()) {
    // eslint-disable-next-line no-use-before-define
    accumulator.push(...walkDirectorySync(item));
  }

  return accumulator;
});