Javascript Arrays:将当前项目移回

时间:2014-08-08 19:19:49

标签: javascript arrays sorting

使用JavaScript,我有一个文件路径数组,我正在循环和检查。如果当前项目是文件夹,我想将其碰到行的后面并继续下一个项目。最终结果将是前面的文件,最后一个文件后面的文件夹。

我知道这应该很容易,但我已经和它斗争了2天。我已经尝试了以下代码的各种版本但没有成功。出于这个项目的目的,我假设它是一个文件夹,如果文件名中没有句号。

function sortArray(array) {

    console.log('Original array: ' + array);
    var z = array.length;
    console.log('Array length is ' + z);

    for(i = 0; i < z-1; i++)
    { 
        var n = array.indexOf(array[i]);


        if (array[i].indexOf('.') === -1)
        {
            console.log('Item is folder');
            var fldr = array.splice(n, 1);
            array.push(fldr);
        }
    }

    console.log('Sorted array: ' + array);
}

6 个答案:

答案 0 :(得分:5)

简短的回答是,通过调用splice后跟push,您将元素添加回数组的 end (尾部),而实际上你想使用unshift将它移到前面(头部)。

但是你可以采取其他更简单的方法。例如,您可以使用sort使用自定义比较函数对数组进行排序:

array.sort(function(x, y) {
  var xFolder = x.indexOf('.') == -1 ? 1 : 0;
  var yFolder = y.indexOf('.') == -1 ? 1 : 0;
  return yFolder - xFolder;
});

这将快速对数组进行排序,首先放置所有文件夹(基于“无期间意味着它是文件夹”标准)。

另一个选择是返回一个新数组,而不是修改当前的数组。这很容易实现:

function putFoldersFirst(entries) {
  var folders = [],
      files = [];

  for (var i = 0; i < entries.length; ++i) {
    if (entries[i].indexOf('.') == -1) {
      folders.push(entries[i]);
    } else {
      files.push(entries[i]);
    }
  }

  return folders.concat(files);
}

一如既往,不止一种方式。

答案 1 :(得分:0)

您应该使用不同的数组进行循环和修改。这是过去很多次让我绊倒的事情。一旦你移动了东西,你的循环索引或迭代器就不能再保证指向正确的项目了。

只需创建一个temparray,当你迭代原始数组时,检查temparray中的正确位置并从那里复制原始数组中的值,完成后返回已排序的数组。

当然,也就是说,如果你想手动完成它而不是使用上面建议的内置排序。

答案 2 :(得分:0)

或者,您可以使用Array.prototype.filter过滤掉具有'.'的项目和不包含项目的项目,并将它们连接起来:

var items = [ 'a', 'b.c', 'adf', 'd.d', 'a.a' ];

var sortedItems = items.filter( function( item ) {
    return item.indexOf( '.' ) !== -1;
  } ).concat( items.filter( function( item ) {
    return item.indexOf( '.' ) === -1;
  } )
);

// you get: ["b.c", "d.d", "a.a", "a", "adf"]

答案 3 :(得分:0)

有很多方法可以做到这一点,但这里有一个使用Array.prototype.sort

var filesAndFolders = ['file1.txt', 'folder2', 'folder1', 'file2.txt'];

function sortFilesAndFolders(arr) {
    return arr.sort(function (a, b) {
        var aIsFolder = isFolder(a),
            bIsFolder = isFolder(b);

        return aIsFolder !== bIsFolder? 
            sortByType(aIsFolder) : 
            sortByName(a, b);
    });

    function sortByType(aIsFolder) { return aIsFolder? 1 : -1; }
    function sortByName(a, b) { return a < b? -1 : +(a > b); }
    function isFolder(item) { return item.indexOf('.') === -1; }
}

sortFilesAndFolders(filesAndFolders);
//["file1.txt", "file2.txt", "folder1", "folder2"]

答案 4 :(得分:0)

如果文件和文件夹的原始顺序对您很重要,您可以使用此功能:

function sortFilesAndFolders (originalArray) {
    var files = [], folders = [];

    originalArray.forEach(function (item) {
        if (item.indexOf(".") === -1) {
            folders.push(item);
        } else {
            files.push(item);
        }
    });

    return folders.concat(files);
}

演示:http://jsfiddle.net/4Lnwz4jh/

答案 5 :(得分:0)

这项任务可以有很多种方法。如果您只想更正代码,那么这就是解决方案: 当您使用拼接时,已删除元素右侧的整个数组向左移动,并且当您增加i时,将丢失当前位置的元素。因此,在这种情况下你不应该增加i。 另一个问题:代替zz-1代替array.splice(i, 1)

应该{​​{1}}代替
array.splice(n, 1)

另一种方法可能是使用自定义比较函数的sort方法对数组进行排序:

function sortArray(array) {
    console.log('Original array: ' + array);
    var z = array.length;
    console.log('Array length is ' + z);
    var i = 0;
    var sortedCount = 0;      // Count of the number of elements already sorted.
    for(sortedCount = 0 = 0; sortedCount < z; sortedCount++)
    { 
        var n = array.indexOf(array[i]);
        if (array[i].indexOf('.') === -1)
        {
            console.log('Item is folder');
            var fldr = array.splice(i, 1);
            array.push(fldr);
        }
        else i++;
    }
    console.log('Sorted array: ' + array);
}