执行 $.getJSON 后对 JSON 数组进行排序

2023-12-11

我的 json 对象和 getJSON() 之间有工作连接。我还可以使用此代码对一次获得的数据进行排序,我在数组的“名称”字段上对它进行排序,它工作正常:

$.getJSON(url,function(json){ 
    function sortJson(a,b){
        return a.name > b.name? 1 : -1;
    }
    json.users.sort(sortJson);  
    $.each(json.users,function(i,row){ 
        $("#output").append(
            '<li>' + row.id + row.name + row.job + '</li>'
        );
    }); 
});

这是我的 json 数组:

{"users":[
{"id":"1","name":"John","job":"worker"}
{"id":"2","name":"Mike","job":"innovator"}
{"id":"3","name":"Anna","job":"reader"}
]}

我想要的是,当我单击按钮时,sortJson() 应该对另一个字段(如“id”或“job”)上的用户进行排序。我这样做了:

function sortJsonField(x){
    var field = x;
    var url="http://localhost/api/users.php";
    $.getJSON(url,function(json){ 
        function sortJson(a,b){
            if(field == "id"){ return a.id > b.id? 1 : -1; }else
            if(field == "job"){ return a.job > b.job? 1 : -1; }else
            return a.name > b.name? 1 : -1;
        }
        json.users.sort(sortJson);  
        $.each(json.users,function(i,row){ 
            $("#output").append(
                '<li>' + row.id + row.name + row.job + '</li>'
            );
        }); 
    });
}

它成功了,现在你应该想知道我的问题是什么。就是这样,每次点击按钮执行sortJsonField('字段名称')。它执行整个 $.getJSON,与 url 建立新的连接并与后端通信。我不想这样,这样太慢,而且服务器的工作量会很重。 我想获取一次 json,然后对数组进行排序(所以实际上我只需要刷新 $.each 函数)。但这不起作用。

有任何想法吗?

好吧,我修改了代码,我想我已经很接近了:

<!DOCTYPE html><head>
<title>Users</title>
<script src="jquery-1.9.1.min.js"></script>
<script>
$(document).ready(function(){
    var url="http://192.168.247.86/X/users.php";
    var json =  { users: [] };
    //getting & storing
    $.getJSON(url,function(response){
        json = response;    
    });
    //sorting
    function sortJsonField(field){
        alert(field);
        function sortJson(a,b){
            if(field == "id"){ return a.id > b.id? 1 : -1; }else
            if(field == "job"){ return a.job > b.job? 1 : -1; }else
            return a.name > b.name? 1 : -1;
        }

        json.users.sort(sortJson);
        showJSON();
    };
    //showing
    function showJSON(){
        $.each(json.users,function(i,row){ 
            $("#output").append(
                '<li><em>' + row.id + '</em><br>' + row.name + '<br>' + row.job  + '</li>'
            );
        });
    };
});
</script>
</head>

<h1>Users</h1>
<button onClick="sortJsonField(Id)">Id</button>
<button onClick="sortJsonField('Name')">Name</button>
<button onClick="sortJsonField('Job')">Job</button>
<ul id="output"></ul>
</body>
</html>

这是我的 json:

{"users":[{"id":"1","name":"John","job":"Worker"},{"id":"2","name":"Mike","job":"Reader"},{"id":"3","name":"Mary","job":"Writer"},{"id":"4","name":"Angelo","job":"Player"},{"id":"5","name":"Kevin","job":"Doctor"},{"id":"6","name":"Zidane","job":"Player"}]}

现在可以使用了

    <!DOCTYPE html>
<head>
<script src="jquery-1.9.1.min.js"></script>
<script>
$(document).ready(function() {
    var url="http://localhost/X/users.php";
    var json = new Array();
    //getter
    $.getJSON(url,function(data){
        json = data;
    }).done(function(){
        sortJsonField();
        $('#sortid').click(function(){
            sortJsonField("id");
        })
        $('#sortname').click(function(){
            sortJsonField("name");
        })
        $('#sortjob').click(function(){
            sortJsonField("job");
        })
    });

        function sortJsonField(field){
            function sortJson(a,b){
                if(field == "id"){ return a.id > b.id? 1 : -1; }else
                if(field == "job"){ return a.job > b.job? 1 : -1; }else
                return a.name > b.name? 1 : -1;
            }
            json.users.sort(sortJson);
            showJSON();
        };
        //shower
        function showJSON(){
            $('#output').empty();
            $.each(json.users,function(i,row){ 
                $("#output").append(
                    '<li><em>' + row.id + '</em><br>' + row.name + '<br>' + row.job + '</li>'
                );
            });
        };
        showJSON(); 
});
</script>
</head>
<body>
<button id="sortid">Id</button>
<button id="sortname">Name</button>
<button id="sortjob">Job</button>
    <div id="output"></div>
</body>
</html>

Do this:

var json = { users: [] };
var url="http://localhost/api/users.php";
$.getJSON(url,function(response){
    json = response;
});

function sortJsonField(field){

    function sortJson(a,b){
        if(field == "id"){ return a.id > b.id? 1 : -1; }else
        if(field == "job"){ return a.job > b.job? 1 : -1; }else
        return a.name > b.name? 1 : -1;
    }

    // No need to assign this to a new array.
    json.users.sort(sortJson);

    showJSON();
};

function showJSON(){

    // May empty the ul/ol before doing this? up to you..
    $.each(json.users,function(i,row){ 
        $("#output").append(
            '<li>' + row.id + row.name + row.job + '</li>'
        );
    });

};

EDIT:另外,JSON 结构有点不正确......

改变这个:

{"users":[
{"id":"1","name":"John","job":"worker"}
{"id":"2","name":"Mike","job":"innovator"}
{"id":"3","name":"Anna","job":"reader"}
]}

....对此:

{"users":[
{"id":"1","name":"John","job":"worker"},     // <--- Do you see the commas here?
{"id":"2","name":"Mike","job":"innovator"},    // <--- and here?
{"id":"3","name":"Anna","job":"reader"}
]}

这些对象格式良好,但不是有效的数组,因此 javascript 中断。修改它,它应该可以工作。

P.S这是我用来检查 JSON 结构的网站的 url:http://www.freeformatter.com/json-validator.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

执行 $.getJSON 后对 JSON 数组进行排序 的相关文章

  • 使用命名的成功/错误回调在 AngularJS 中声明一个 Promise

    我正在尝试做一些与 http 服务非常相似的事情 根据我的理解 http 返回一个 Promise 对象 使用它时 语法是 http success function data success callback error function
  • 在多个动态添加的表单上初始化 jQuery validate() 函数

    有人建议最好初始化一个 form validate 在页面加载而不是点击事件上运行 jquery form validate 插件仅允许在输入更改时提交 https stackoverflow com questions 10984196
  • 递归修剪对象中所有元素的更好方法?

    如果我有一个像这样的物体 const obj field subfield innerObj a asdasd asdas innerArr s ssad innerArrObj b adsad 我想出了这样的东西 const trimFi
  • 如何在清除排序描述后删除wpf网格排序箭头

    我单击网格标题对列进行排序 然后单击 重置 按钮以通过其集合视图清除排序描述 但排序箭头图标仍然保留在标题中 如何去除它 我在尝试弄清楚如何完全清除网格中的排序时遇到了这个问题 感谢 krishnaaditya 回答如何清除标题中的排序箭头
  • 在动态创建的元素上添加事件监听器[重复]

    这个问题在这里已经有答案了 是否可以向所有动态生成的元素添加事件侦听器 Javascript 我不是页面的所有者 因此我无法以静态方式添加侦听器 对于页面加载时创建的所有元素 我使用 doc body addEventListener cl
  • 如何在php中使用一张图像绘制形状

    我需要使用图像的一部分来创建帧图像 例如 用户将从后端上传图像片段 现在我需要根据前端用户的要求在前端创建一个框架 用户将选择框架的高度和宽度 然后他将选择该图像片段 如下所示 我没有办法做到这一点 我尝试通过 css 和 html can
  • 为什么我们使用 SpreadsheetApp.flush()?

    我的理解是 flush https developers google com apps script reference spreadsheet spreadsheet app flush有助于在功能发生时执行这些功能 而无需将它们捆绑在
  • 如何为 Gson 编写自定义 JSON 反序列化器?

    我有一个 Java 类 用户 public class User int id String name Timestamp updateDate 我收到一个包含来自 Web 服务的用户对象的 JSON 列表 id 1 name Jonas
  • 使 Material UI Grid 项目的子项拉伸以适合父容器的剩余高度

    1 现状 我有一个包含 4 个网格项的 Material UI 网格容器 每个 Grid 项中都有一个 Typography 组件 其中包含标题和包含一些内容的 Card 如下所示 2 期望的外观 我希望卡片填充网格项目的剩余高度并且不超过
  • 如何知道浏览器空闲时间?

    如何跟踪浏览器空闲时间 我用的是IE8 我没有使用任何会话管理 也不想在服务器端处理它 这是纯 JavaScript 方法来跟踪空闲时间 并在达到一定限制时执行一些操作 var IDLE TIMEOUT 60 seconds var idl
  • jQuery / Ajax:如何循环遍历数组作为 Ajax 成功函数的一部分

    我有一个阿贾克斯调用返回一个数组并需要对该数组中的每个值执行某些操作 到目前为止 我有以下内容 但这会返回以下错误 Uncaught TypeError Cannot use in operator to search for length
  • 尝试使用 Firebug 查找 JavaScript 文件中的函数

    我试图找到这个函数调用 myFooBar 该函数在某些 HTML 中内联引用 但页面加载了大量 JavaScript 并且在每个文件中搜索该函数需要相当多的工作 如何使用 Firebug 找到此函数所在的 JavaScript 文件 打开脚
  • 归并排序中的递归:两次递归调用

    private void mergesort int low int high line 1 if low lt high line 2 int middle low high 2 line 3 mergesort low middle l
  • 如何使用 JavaScript 获取元素的填充值?

    我有一个textarea在我的 HTML 中 我需要获取整数或浮点形式的填充数值 以像素为单位 我如何使用 JavaScript 获取它 我没有使用 jQuery 所以我正在寻找纯 JavaScript 解决方案 这将返回padding l
  • Javascript onload 不起作用[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在使用
  • 弹出窗口的动态高度取决于内容,可能吗?

    是否有可能获得一个宽度始终为 400px 的弹出窗口 但根据弹出窗口中的内容动态高度 我已经看到了这个 但不知道如何将其应用到弹出窗口 调整 iframe 的宽度高度以适应其中的内容 https stackoverflow com ques
  • 检测浏览器选项卡是否具有焦点

    是否有可靠的跨浏览器方法来检测选项卡是否具有焦点 场景是 我们有一个定期轮询股票价格的应用程序 如果页面没有焦点 我们可以停止轮询并为每个人节省流量噪音 特别是当人们喜欢打开具有不同投资组合的多个选项卡时 Is window onblur
  • 搜索多维数组 JavaScript

    我有一个如下所示的数组 selected products 0 r1 7up 61 Albertsons selected products 1 r3 Arrowhead 78 Arrowhead selected products 2 r
  • D3 将现有 SVG 字符串(或元素)追加(插入)到 DIV

    我到处寻找这个问题的答案 并找到了一些我认为可能有用的资源 但最终没有让我找到答案 这里有一些 外部SVG http bl ocks org mbostock 1014829 嵌入SVG https stackoverflow com qu
  • DOM 解析器 Chrome 扩展内存泄漏

    问题 我开发了一个扩展程序 可以拦截 Web 请求 获取 Web 请求来源的 HTML 并对其进行处理 我使用 DOMParser 来解析 HTML 并且意识到 DOMParser 正在导致大量内存泄漏问题 最终导致 chrome 扩展崩溃

随机推荐

  • 没有周末的约会的倒退

    我经常用这个query1要返回 6 天的可变日期 query1 SELECT DATE FORMAT DATE 2018 11 21 INTERVAL S I 1 DAY Y m d AS VAR FROM HELPER SEQ AS S
  • 局部变量声明问题

    我收到以下错误 在声明之前不能使用局部变量 dob 这是我的实现 public class Person public string dob get set public int getAge DateTime origin DateTim
  • 从列表中打印随机字符串(多次),不重复

    我想在整个程序中多次打印同一列表中的随机字符串 但不重复任何先前打印的随机字符串 如果我有以下内容 core a b c d print random sample core 0 k 2 print random sample core 0
  • 如何使用列表中的元素构建特定形状的树

    给定一个 s 表达式 a b c d 和一个清单 e f g h 如何遍历 s 表达式创建具有相同形状但元素取自列表的 s 表达式 例如 对于上面的 s 表达式和列表 结果将是 e f g h 按从左到右的顺序遍历树对并不是特别困难 因为c
  • 获取任意给定数量的包含字符串的数组的交集元素的函数

    我有以下函数返回一些字符串数组之间的元素的交集 最初它只打算处理 2 个数组 但我开始需要它处理 2 个以上的数组 所以我添加了条件return使其递归 我怎样才能让它足够灵活 以便它能够处理任意数量的数组 当然等于或大于 2 我想过使用
  • 使用 Qt 运行日志流处理程序时 Python 崩溃

    Goal 我有一个在运行时记录文件 realtime log 的进程 我想在我的应用程序中实时打印该文件的每个新行 换句话说 我想将进程的输出重定向到 GUI 这意味着我有两个不同的过程运行 引擎 和GUI 我已经通过使用 Tkinter
  • 在 reStructuredText 中格式化链接中的文本

    如何格式化 reStructuredText 中指定链接内的文本 具体来说 我希望从我的第一个代码生成以下 HTML a href http docs python org library optparse html a
  • 无法在 Heroku 上启用 user-env-compile

    这是我第一次提出要求 如果我不够精确 请见谅 我尝试使用启用 user env compile 来管理我的密钥来在 heroku 上上传我的 Rails 应用程序 但出现错误 没有此类功能 user env compile 我检查了 Her
  • 如何在 Struts 2 中使用 XML 配置验证特定操作

    我只想在操作类中验证特定方法 行动方法是这样的 public String add throws Exception aflag true org setAoName aoName orgBo addOrg org orglist orgB
  • 从 ClassMap 中查找主键

    With Fluent NHibernate 我有一个任意的ClassMap
  • 在 HashMap 中使用复杂键时如何避免临时分配?

    我正在使用复杂的密钥HashMap这样密钥包括两部分 其中一部分是String 我不知道如何通过HashMap get方法无需分配新的String对于每个查找 这是一些代码 derive Debug Eq Hash PartialEq st
  • libgdx touchDown 仅调用一次

    我是 LibGdx 的新手 在输入处理方面遇到问题 我的玩家需要在触摸按下时射击子弹 但这个方法似乎只被调用一次 然后用户必须再次单击才能发射另一颗子弹 我总是想在点击按下时射击子弹 有没有办法处理这个用例 调查对触摸输入进行 轮询 而不是
  • 由于 XCode 更新到版本 6,无法启动 QtCreator 调试器

    Xcode 将自身更新到版本 6 现在我无法在调试模式下启动 QtCreator 有谁知道如何解决这个问题 这是一个Qt Creator 中的已知错误 解决方法很简单 在 窗口 gt 视图 中 显示调试器命令日志 然后启动调试会话 稍等一下
  • JavaScript 中的面向对象编程

    我想知道在 Javascript 中使用 OOP 的最佳方式是哪种 有这个原型的东西 你就有了函数风格的方式 但两者继承基类的方法都很糟糕 所以我尝试建立一种方法来实现这一点 而不必使用原型等 function Car name this
  • Mongo 子字段查询

    我有一份文件 id ObjectId 51385d2308d427ce306f0100 aid 1 studyId study 1 mediaType microBlog text bla bla sentences bla bla sta
  • 如何使用 SQL 计算月度保留率

    尝试获得一个基本表格 显示从一个月到下个月的保留情况 因此 如果有人上个月买了东西 下个月又买了 那么就会被计算在内 month num transactions repeat transactions retention 2012 02
  • HTML 到 PDF 动态添加目录 (TOC)

    我正在使用 iText 7 将 html 转换为 PDF 但我什至找不到一个有关如何将目录添加到最终 PDF 的示例 按照 iText 示例 将文本转换为 PDF 并添加目录是一项简单的任务here 但显然在将 HTML 转换为 PDF 时
  • AngularJS HTTP post 到 PHP 且未定义

    我有一个带有标签的表格ng submit login 该函数在 javascript 中被调用得很好 function LoginForm scope http http defaults headers post Content Type
  • 如何用 sed 删除尾随空格?

    我有一个简单的 shell 脚本 可以从文件中删除尾随空格 有什么方法可以使这个脚本更加紧凑 无需创建临时文件 sed s t 1 gt 1 tmp cat 1 tmp gt 1 rm 1 tmp 您可以使用就地选项 i of sed对于
  • 执行 $.getJSON 后对 JSON 数组进行排序

    我的 json 对象和 getJSON 之间有工作连接 我还可以使用此代码对一次获得的数据进行排序 我在数组的 名称 字段上对它进行排序 它工作正常 getJSON url function json function sortJson a