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

时间:2011-09-12 14:38:37

标签: 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并且它应该位于数组的顶部索引处?

2 个答案:

答案 0 :(得分:4)

你真的不应该使用平面阵列。您丢失了所有分层信息。这样的事情会更好:

//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]);
    }
}

修改

Rob建议使用levels.sort(function(x,y){return x.localeCompare(y)})代替常规.sort()。前者会将["abc", "Abcd", "Ab"]排序为["Ab", "abc", "Abcd"]而不是["Ab", "Abcd", "abc"]

答案 1 :(得分:1)

这应该将平面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]);
  }
}

应提供以下levelsbetterArray

// levels:
['Level 4','Level 3','Level 1','Level 2']

// betterArray:
{
    'Level 2': ['chapter 1','chapter 2'],
    'Level 4': ['chapter 1','chapter 2'],
    'Level 1': ['chapter 1','chapter 2'],
    'Level 3': ['chapter 1','chapter 2']
}

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