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

时间:2016-01-11 07:15:49

标签: javascript node.js

我有一个数组,其中包含文件名作为数组的实体。我想根据文件的大小对这个数组进行排序。

例如,

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

所以我目前所拥有的是创建一个文件名为文件的对象,文件大小为值。

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

有更好的方法吗?是否可以在本地执行此操作,我的意思是读取文件大小并基于此创建对象?

4 个答案:

答案 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应该提高排序算法的性能,这是我上次检查时节点的快速排序。