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