如何根据文件大小对nodejs中的数组进行sorting?

我有一个数组的文件名称作为数组的实体。 我想根据文件的大小对这个数组进行sorting。

例如,

var arr=['index.html','README.md','index.html']; 

所以我现在所拥有的就是创build一个名为文件的对象作为文件的键值和大小。

现在我从远程位置获取这些文件,所以我可以从content-length标题中获取文件大小

有没有更好的方法来做到这一点? 有可能在本地做到这一点,我的意思是读取文件的大小,并创build一个对象的基础上呢?

尝试这个:

 var arr = ['index.html','README.md','index.html']; arr.sort(function(a, b) { return fs.statSync(a).size - fs.statSync(b).size; }); 

我假设这些文件在你的当前目录中。

简短的memoized版本没有承诺:

 var arr = ['index.html', 'README.md', 'index.html']; var sortedArray = arr // get the size of each file .map(file => { return { file: file, size: fs.statSync(file).size } }) // sort by size ascending .sort((a, b) => a.size > b.size) // return a simple sorted array of the file names only .map(f => f.file); console.log(sortedArray); 

使用蓝鸟承诺,我会做这样的事情:

 var Bluebird = require('bluebird'), fs = Bluebird.promisifyAll(require('fs')), arr = [ // your file array ]; // retriving size of each file function getSize(file){ return fs.statAsync(file).then(stats => stats.size); } Promise.all(arr.map( file=> getSize(file).then(size=> {return {file, size}}))) .then(sizedArry => { console.log(sizedArry); var sortedArray = sizedArry.sort((a, b) => a.size > b.size); // sorting array based on size console.log('sorted array: ', sortedArray); // if you want only the sorted file names... return sortedArray.map(element => element.file); }); 

扩展@ Gothdo的答案:

 var fs = require('fs'); var arr = ['index.html','README.md','index.html']; function memoize(func) { var cache = {}; // assumes argument is string return function memoized(str) { if (cache[str]) return cache[str]; return (cache[str] = func(str)); }; } var statSync = memoize(fs.statSync); arr.sort(function sort(a, b) { return statSync(a).size - statSync(b).size; }); 

记忆函数应该提高sortingalgorithm的性能,这是节点中的快速sorting,上次我检查了。