如何加速从大型数组中过滤掉元素的函数

时间:2018-06-04 12:46:43

标签: javascript node.js

在基于node.js的程序中,我试图从500,000多个路径的数组中过滤掉元素,例如:paths = ['C:/test/file.txt', 'C:/python/', ...]

代码

基本上,代码正在做的是:

  • 如果itemTypeToSearch"files" =>通过过滤出"目录"的所有路径来更新paths数组。 (只留下文件)

  • 如果itemTypeToSearch"folders" =>通过过滤掉"文件"的所有路径来更新paths数组。 (只留下目录)

import fs from 'fs'
...
itemTypeToSearch: ["files"]
...

console.time("time it took:")
  // IF ONLY 1 TYPE SELECTED, FILTER IT OUT
  if (this.itemTypeToSearch.length == 1 && this.itemTypeToSearch.includes("files")) {
    paths = paths.filter(element => { 
      return fs.statSync(element).isFile()
    })
  } 
  else if (this.itemTypeToSearch.length == 1 && this.itemTypeToSearch.includes("folders")) {
    paths = paths.filter(element => { 
      return fs.statSync(element).isDirectory()
    })
  }     
console.timeEnd("time it took:")

此过滤操作大约需要4 seconds来处理100,000个路径的数组。

之后,我将过滤后的数组转换为一个对象数组,以便在另一个函数中进一步使用:

[{path: 'C:/test/file.txt'}, {path: 'C:/python/python.exe'}, ...]

问题

如何让它更快? (比如快得多)

我应该将其转换为第一个对象数组吗?这会让我更快地过滤物品吗?

1 个答案:

答案 0 :(得分:0)

使用fs.statSync(element).isDirectory()fs.statSync(element).isFile()时,我无法更快地过滤掉这么大的数组中的元素。

也许可以通过检查字符串是否以已知扩展名结尾(这意味着它是一个文件)来更快地完成,正如@epascarello在评论中所建议的那样。

也许会有人发布解决方案。

解决方法

就我而言,在非过滤阵列上进行所有操作的速度要快10倍(尽管它的路径数量约为2倍)

然后当程序显示最终结果(限制为100个项目)时,在此步骤中将其过滤掉,这将只需几毫秒