gpt4 book ai didi

javascript - 如何按嵌套值对 JSON 对象进行排序?

转载 作者:数据小太阳 更新时间:2023-10-29 04:02:35 28 4
gpt4 key购买 nike

我有一个 ajax 调用返回一个非常复杂的 JSON 对象,我很难对其进行排序。

我的电话:

$.post('/reports-ajax',arguments, function(data) {}

响应:

{
"10001":{
"unitname":"Fort Worth",
"discounts":{"12-02-2012":"34.810000","12-03-2012":"20.810000","12-04-2012":"27.040000"},
"gross":{"12-02-2012":"56.730000","12-03-2012":"19.350000","12-04-2012":"66.390000"},
"net":{"12-02-2012":"61.920000","12-03-2012":"98.540000","12-04-2012":"39.350000"},
"discounts_total":82.66,
"gross_total":82.47,
"net_total":99.81,
"number":10001
},
"10002":{
"unitname":"Dallast",
"discounts":{"12-02-2012":"12.600000","12-03-2012":"25.780000","12-04-2012":"47.780000","12-05-2012":"45.210000"},
"gross":{"12-02-2012":"29.370000","12-03-2012":"91.110000","12-04-2012":"60.890000","12-05-2012":"51.870000"},
"net":{"12-02-2012":"16.770000","12-03-2012":"65.330000","12-04-2012":"13.110000","12-05-2012":"06.660000"},
"discounts_total":131.37,
"gross_total":33.24,
"net_total":101.87,
"number":10002
},
"32402":{
"unitname":"Austin",
"discounts":{"12-05-2012":"52.890000","12-02-2012":"22.430000","12-03-2012":"58.420000","12-04-2012":"53.130000"},
"gross":{"12-05-2012":"25.020000","12-02-2012":"2836.010000","12-03-2012":"54.740000","12-04-2012":"45.330000"},
"net":{"12-04-2012":"92.200000","12-05-2012":"72.130000","12-02-2012":"13.580000","12-03-2012":"96.320000"},
"discounts_total":186.87,
"gross_total":161.1,
"net_total":174.23,
"number":32402
}
}

我用标准的 each 调用检查了函数,并用 highcharts 做了一些很棒的事情,但现在我试图通过 net_total 调用对响应进行排序,但我无法弄清楚。

我尝试了 .sort() 并错误地指出它不是一个函数。我已经阅读了一段时间,但我想我没有找到正确的结果。这看起来很有希望:Sorting an array of JavaScript objects但它失败了 .sort is not a function。似乎大多数 .sort 都在 [] 数组上而不是完整的对象..

如有任何帮助,我们将不胜感激。

最佳答案

排序对象没有意义,因为对象键没有位置值。例如,这个:

{ a:1, b:2 }

还有这个:

{ b:2, a:1 }

是完全相同的对象。它们不仅相似,而且相同。

javascript 本身并没有为对象键提供任何位置值。有些人可能错误地认为:

for (var key in obj) {

以特定顺序遍历对象键。但这是错误的。您应该始终假设 for .. in 循环始终以随机顺序处理对象键。

显然,如果您要编写 Web 浏览器,则不会实现随机数生成器来解析 for .. in 循环。因此,大多数网络浏览器对 for .. in 循环如何处理对象键具有意外稳定性。

通过玩弄浏览器来学习 javascript 的开发人员可能会发现,他们的浏览器会按字母顺序(例如将键添加到对象的顺序)遍历对象。但这完全是偶然的,不能依赖。浏览器 vendor 将来可能会在不违反任何向后兼容性的情况下更改此行为(相信对象具有排序顺序的人编写的错误脚本除外)。更不用说不同的浏览器有不同的 javascript 实现,因此不一定具有相同的对象内部键顺序。

以上都是题外话。 “键排序顺序”在 javascript 中没有任何意义,观察到的任何行为都只是实现细节。简而言之,javascript 对象没有键顺序,只是假设它是随机的。


解决方案

现在,您真正要做的是对对象进行排序(您不能,这没有意义)。您真正想要做的是以特定顺序处理对象属性。解决方案是简单地创建一个对象键数组(具有排序顺序),然​​后使用该数组处理对象:

// First create the array of keys/net_total so that we can sort it:
var sort_array = [];
for (var key in Response) {
sort_array.push({key:key,net_total:Response[key].net_total});
}

// Now sort it:
sort_array.sort(function(x,y){return x.net_total - y.net_total});

// Now process that object with it:
for (var i=0;i<sort_array.length;i++) {
var item = Response[sort_array[i].key];

// now do stuff with each item
}

关于javascript - 如何按嵌套值对 JSON 对象进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13758467/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com