【问题标题】:Javascript Sort Array by ValueJavascript 按值对数组进行排序
【发布时间】:2012-10-19 20:45:20
【问题描述】:

我有一个 AJAX 调用返回 JSON 之类的......

{
  490: "A",
  675: "B",
  491: "C",
  520: "D",
  681: "E",
  679: "F",
  538: "G"    
}

然后我将它附加到 select 使用:

var output = jQuery.parseJSON(data);

$.each(output, function(key, value) {
    $el.append($("<option></option>")
       .attr("value", key).text(value));
});

我想按值排序,所以输出是A,B,C,D...,因为现在它只是按键的顺序读取。

这是关键 - 似乎在 Firefox 中运行良好,而不是在 Chrome 中。

【问题讨论】:

  • 您是否在 chrome 中检查了控制台以查看遇到的错误是什么?
  • 是的,FF 或 Chrome 中没有错误
  • 什么在 Firefox 中运行良好但在 Chrome 中不行?追加输出?您没有向我们展示一些排序算法?
  • 您是否尝试过以任何方式进行调试?例如在排序之前和之后的任何阶段输出任何内容?
  • 你能在服务器端排序吗?

标签: jquery arrays sorting


【解决方案1】:

先转换成数组,排序,然后创建html。 jsfiddle

var output = jQuery.parseJSON(data);
var temp = [];

$.each(output, function(key, value) {
    temp.push({v:value, k: key});
});
temp.sort(function(a,b){
   if(a.v > b.v){ return 1}
    if(a.v < b.v){ return -1}
      return 0;
});
$.each(temp, function(key, obj) {

$el.append($("<option></option>")
       .attr("value", obj.k).text(obj.v));
});

【讨论】:

  • 如果您已经使用 SQL 对其进行排序,为什么还要使用 javascript 对其进行排序?你是在治疗症状而不是解决问题。
  • 添加另一个排序或完全更改时会发生什么。
  • @KevinB 他没有提到有问题的服务器端排序。我错过了什么吗?
  • 评论中提到了“我有它在服务器端排序,这是(目前)唯一的排序(ORDER BY 'name')”,这也是: “是的,我得到的数据是 600 个条目和一大堆信息”
  • @KevinB 即使在服务器端排序也不会在这里产生副作用。
【解决方案2】:

无法对对象进行排序。尝试将您的 JSON 作为数组返回,以确保它保持与您返回它们的确切顺序:

[
  {"id":490,"name":"A"},
  {"id":675,"name":"B"},
  {"id":491,"name":"C"},
  {"id":520,"name":"D"},
  {"id":681,"name":"E"},
  {"id":679,"name":"F"},
  {"id":538,"name":"G"}
]

这是对原始的小提琴:http://jsfiddle.net/82BSm/2/ 并更改为数组:http://jsfiddle.net/82BSm/1/

根据 pst 的评论更新

您当然可以通过将列名(“id”和“name”)与数据分开并使其成为数组数组来缩小 json 响应大小。

【讨论】:

  • 我不认为这真的是一个问题,因为它返回的顺序似乎与它应该显示的顺序无关。 OP 似乎希望对一组未排序的值进行排序,在这种情况下,他返回的对象会很好地完成这项工作。 我可能完全错了
  • @JonTaylor 我同意,但我怀疑他实际使用的数据可能不是他发布的数据。
  • 是的,我得到的数据是 600 个条目和一大堆信息。我发布了一个例子。 ID 是在数据端关联的 ID。
  • @Fluidbyte 对,看看我刚刚添加的小提琴,它们表明当使用对象时,排序顺序会发生变化,但是当使用数组时,它会保持相同的排序顺序。
  • +1 - 在服务器上排序(如果可用)是一个干净的选项。但是,我会使用 [[490, "A"], ..][{id: 490, val: "A"}, ..],因为 490 在这里确实不能用作键。
【解决方案3】:

这样的事情怎么样?

var output = jQuery.parseJSON(data);

var options = [];
$.each(output, function(key, value) {
    options.push(
        $("<option>").val(key).text(value)
    );
});

options.sort(function(a, b) {
    return a.text() > b.text();
});

【讨论】:

  • sort 应该返回一个整数而不是布尔值(尽管布尔值至少在 FF 中有效),所以让它 a.text() - b.text() 在更多浏览器中工作。
猜你喜欢
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
  • 2022-12-13
  • 2011-11-16
相关资源
最近更新 更多