我有一个数组,其中包含文件名作为数组的实体。我想根据文件的大小对这个数组进行排序。
例如,
var arr=['index.html','README.md','index.html'];
所以我目前所拥有的是创建一个文件名为文件的对象,文件大小为值。
现在我从远程位置获取这些文件,因此我可以从content-length
标题中获取文件大小。
有更好的方法吗?是否可以在本地执行此操作,我的意思是读取文件大小并基于此创建对象?
答案 0 :(得分:3)
试试这个:
var arr = ['index.html','README.md','index.html'];
arr.sort(function(a, b) {
return fs.statSync(a).size - fs.statSync(b).size;
});
我认为这些文件位于您当前的目录中。
答案 1 :(得分:2)
没有承诺的简短备忘版本:
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);
答案 2 :(得分:0)
使用Bluebird承诺,我会这样做:
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);
});
答案 3 :(得分:0)
扩展@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;
});
Memoizing the function应该提高排序算法的性能,这是我上次检查时节点的快速排序。