我有一个包含分层形式数据的数组,例如:
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并且它应该位于数组的顶部索引处?
答案 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]);
}
}
应提供以下levels
和betterArray
:
// 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']
}
现在,您可以在子阵列上运行您想要的任何排序,并获得您想要的内容。