在数组中对选定项进行排序(javascript)

在数组中对选定项进行排序(javascript),javascript,arrays,sorting,Javascript,Arrays,Sorting,我有一个数组,其中包含分层形式的数据,例如: Level 2 chapter 1 chapter 2 Level 4 chapter 1 chapter 2 Level 1 chapter 1 chapter 2 Level 3 chapter 1 chapter 2 如果我只调用array.sort(),层次结构就会受到干扰。所以,我必须发展我自己的分类方式。我不明白的是,我如何比较两个级别,以便知道级别1小于级别2,并且应该位于数组的顶部索引?您真的不应该使

我有一个数组,其中包含分层形式的数据,例如:

Level 2
  chapter 1
  chapter 2
Level 4
  chapter 1
  chapter 2
Level 1
  chapter 1
  chapter 2
Level 3
  chapter 1
  chapter 2

如果我只调用
array.sort()
,层次结构就会受到干扰。所以,我必须发展我自己的分类方式。我不明白的是,我如何比较两个级别,以便知道级别1小于级别2,并且应该位于数组的顶部索引?

您真的不应该使用平面数组。您将丢失所有层次结构信息。这样做会更好:

//I've deliberately made these unsorted to show you that sorting works
levels = ["Level 4", "Level 3", "Level 1", "Level 2"];

data = {
  "Level 3" : ["chapter 1", "chapter 2"],
  "Level 1" : ["chapter 2", "chapter 1"],
  "Level 2" : ["chapter 2", "chapter 1"],
  "Level 4" : ["chapter 1", "chapter 2"]  
};

levels.sort();
for(var i = 0 i < levels.length; i++) {
    console.log(levels[i]);
    var chapters = data[levels[i]];

    chapters.sort();    
    for(var j = 0; j < chapters.length; j++) {
        console.log(chapters[j]);
    }
}
//我特意对这些进行了未排序,以向您展示排序是有效的
级别=[“四级”、“三级”、“一级”、“二级”];
数据={
“三级”:[“第一章”、“第二章”],
“一级”:[“第二章”、“第一章”],
“二级”:[“第二章”、“第一章”],
“四级”:[“第一章”、“第二章”]
};
levels.sort();
对于(变量i=0 i
编辑


Rob建议使用
levels.sort(函数(x,y){return x.localeCompare(y)})
而不是常规的
.sort()
。前者将把
[“abc”,“abc”,“abc”]
排序为
[“Ab”,“abc”,“abc”]
,而不是
[“Ab”,“abc”,“abc”]

您真的不应该使用平面数组。您将丢失所有层次结构信息。这样做会更好:

//I've deliberately made these unsorted to show you that sorting works
levels = ["Level 4", "Level 3", "Level 1", "Level 2"];

data = {
  "Level 3" : ["chapter 1", "chapter 2"],
  "Level 1" : ["chapter 2", "chapter 1"],
  "Level 2" : ["chapter 2", "chapter 1"],
  "Level 4" : ["chapter 1", "chapter 2"]  
};

levels.sort();
for(var i = 0 i < levels.length; i++) {
    console.log(levels[i]);
    var chapters = data[levels[i]];

    chapters.sort();    
    for(var j = 0; j < chapters.length; j++) {
        console.log(chapters[j]);
    }
}
//我特意对这些进行了未排序,以向您展示排序是有效的
级别=[“四级”、“三级”、“一级”、“二级”];
数据={
“三级”:[“第一章”、“第二章”],
“一级”:[“第二章”、“第一章”],
“二级”:[“第二章”、“第一章”],
“四级”:[“第一章”、“第二章”]
};
levels.sort();
对于(变量i=0 i
编辑


Rob建议使用
levels.sort(函数(x,y){return x.localeCompare(y)})
而不是常规的
.sort()
。前者将
[“abc”,“abc”,“abc”]
排序为
[“Ab”,“abc”,“abc”]
,而不是
[“Ab”,“abc”,“abc”]

这应该将平面PHP数组重新格式化为更好的JS对象:

var fromPHP = ['Level 2','chapter 1','chapter 2','Level 4','chapter 1','chapter 2','Level 1','chapter 1','chapter 2','Level 3','chapter 1','chapter 2'];

var levels = [],
    betterArray = [fromPHP[0]],
    currentLevel=betterArray[0];

for (var i=1;i<fromPHP.length;i++) {
  if (fromPHP[i].substr(0,5) == 'Level') {
    currentLevel = [];
    levels.push(fromPHP[i]);
    betterArray[fromPHP[i]] = currentLevel;
  } else {
    currentLevel.push(fromPHP[i]);
  }
}

现在,您可以在子数组上运行您想要的任何排序,并获得您想要的结果。

这应该将平面PHP数组重新格式化为更好的JS对象:

var fromPHP = ['Level 2','chapter 1','chapter 2','Level 4','chapter 1','chapter 2','Level 1','chapter 1','chapter 2','Level 3','chapter 1','chapter 2'];

var levels = [],
    betterArray = [fromPHP[0]],
    currentLevel=betterArray[0];

for (var i=1;i<fromPHP.length;i++) {
  if (fromPHP[i].substr(0,5) == 'Level') {
    currentLevel = [];
    levels.push(fromPHP[i]);
    betterArray[fromPHP[i]] = currentLevel;
  } else {
    currentLevel.push(fromPHP[i]);
  }
}

现在,您可以在子阵列上运行您想要的任何排序,并得到您想要的。

我不知道您的阵列是什么样子的……这个阵列是如何形成的?它真的是一个
数组
还是一个
对象
你的数组是平面的?像
['level2','chapter1','chater2','level4']
etc这是指数组中的数组吗?不,这是一个包含这些字符串的数组。数组[0]=二级,数组[1]=第一章,数组[3]=四级等等…所以它是一个平面数组!!我不知道你的阵列是什么样子…这个阵列是如何形成的?它真的是一个
数组
还是一个
对象
你的数组是平面的?像
['level2','chapter1','chater2','level4']
etc这是指数组中的数组吗?不,这是一个包含这些字符串的数组。数组[0]=二级,数组[1]=第一章,数组[3]=四级等等…所以它是一个平面数组!!数据数组中多余的逗号会使IE呕吐。另一个注意事项:使用
levels.sort(函数(x,y){return x.localeCompare(y)})
而不是普通的
.sort()
。正常排序功能将
[“abc”、“abu”、“Ab”]
排序到
[“Ab”、“abu”、“abc”]
。我的建议将导致
[“Ab”、“abc”、“Abcd”]
@Jens,这是一个复制的语法错误。罗布,谢谢!我将编辑我的答案。数据数组中多余的逗号将使IE呕吐。另一个注意事项:使用
levels.sort(函数(x,y){return x.localeCompare(y)})
而不是普通的
.sort()
。正常的排序功能将
[“abc”、“Abcd”、“Ab”]
排序到
[“Ab”、“Abcd”、“abc”]
。我的建议将导致
[“Ab”、“abc”、“Abcd”]
@Jens,这是一个复制的语法错误。罗布,谢谢!我将编辑我的答案。