你能按字母顺序排序一个从JSON文件动态创建的jQuery列表吗?

时间:2016-01-20 23:48:37

标签: javascript jquery json

我正在构建一个涉及jQuery移动目录的应用程序,该目录从JSON文件加载三个名称部分。我想知道是否有一种方法可以自动对JSON数组中的项进行字母顺序排列。委托应用程序的人将来需要添加项目,如果他们不必担心自己按字母顺序添加项目,则会更容易。由于IP,我在这里添加了稍微不同的代码,但它应该以相同的方式工作。为了澄清,正确的代码只有" name",而不是" firstName"和lastName",所以必须按姓氏排序。

编辑:我意识到这个问题是重复的,我不确定我能证明它的独特之处,但是对我有用的解决方案没有在另一页上给出,所以该页面我不会回答我的问题。

HTML:

var length = 5; 
var re = RegExp("(?:\\s|^)(.{1," + length + "})(?=\\s|$)", "g");
var str = 'My cool code on StackOverflow.';
var res = [];
while ((m = re.exec(str)) !== null) {
  res.push(m[1]);            // Your value is in Group 1
}
document.body.innerHTML = "<pre>" + JSON.stringify(res, 0, 4) + "</pre>"; // just demo

JavaScript的:

<div data-role="page" id="home"> 
            <div data-role="header">
                <h1>Star Trek: The Next Generation</h1>
            </div>
            <div data-role="main" class="ui-content">
                <div data-role="collapsible" data-collapsed="true">
                    <h2>Humans</h2>
                    <ul id="humans" data-role="listview" data-filter="true" data-inset="true" data-icon="user" data-autodividers="true">
                    </ul>
                </div>
                <div data-role="collapsible" data-collapsed="true">
                    <h2>Robots</h2>
                    <ul id="robots" data-role="listview" data-filter="true" data-inset="true" data-icon="gear" data-autodividers="true"> 
                    </ul>
                </div>
                <div data-role="collapsible" data-collapsed="true">
                    <h2>Wesley</h2>
                    <ul id="wesleys" data-role="listview" data-filter="true" data-inset="true" data-icon="forbidden" data-autodividers="true">
                    </ul>
                </div>
            </div>
        </div>

JSON:

$(document).ready( function() {
    $.getJSON("assets/js/starTrek.json", function(data){
        $.each(data.enterprise.humans, function(){
            $("ul#humans").append('<li>' + '<a href="#' + this["url"] + '" data-transition="slide">'+ this["firstName"] + ' ' + this["lastName"] + '</a>' + '</li>');
            $("ul#humans").listview("refresh");
        });
        $.each(data.enterprise.robots, function(){
            $("ul#robots").append('<li>' + '<a href="#' + this["url"] + '" data-transition="slide">'+this["firstName"] + ' ' + this["lastName"] + '</a>' + '</li>');
            $("ul#robots").listview("refresh");
        });
        $.each(data.enterprise.wesleys, function(){
            $("ul#wesleys").append('<li>' + '<a href="#' + this["url"] + '" data-transition="slide">'+ this["firstName"] + ' ' + this["lastName"] + '</a>' + '</li>');
            $("ul#wesleys").listview("refresh");
        });
    });
})

2 个答案:

答案 0 :(得分:1)

试试这个:

data.enterprise.humans.sort(function(a, b) {
  return a.firstName.localeComapre(b.firstName);
});

答案 1 :(得分:1)

最高性能的解决方案可能是查询已经排序的数据(例如,如果数据来自数据库,这相对来说是微不足道的)。您还可以选择在服务器端进行排序。在前端,您可以使用例如

data.enterprise.humans.sort(function(first, second) {
    return first.name.localeCompare(second.name);
});

您应该对data.enterprise.robots和data.enterprise.wesleys执行相同操作,方法是重复代码或编写循环,例如:

for (key in data.enterprise) {
    data.enterprise[key].sort(function(first, second) {
        return first.name.localeCompare(second.name);
    });
}

请注意,后者仅在data.enterprise中的所有子数组都包含具有名称的对象时才有效。