对JSON对象进行排序

时间:2011-05-27 03:27:12

标签: javascript jquery json sorting object

尝试对JSON对象进行排序时遇到问题。基本上,人们可以按任意随机顺序将产品添加到我们的订单表单中,但是它在摘要中显示的顺序需要是我们希望它们如何定位(而不是他们选择它们的顺序),这就是我需要排序的原因'id'(或者我们稍后将按'pos'字段排序)

基本上,我需要按id升序排序。 1,2,103而不是2,103,1

我似乎遇到了问题,因为单个对象的索引是数字(或者只是它们存在的事实......)。

我需要按照array.sort(function(a,b){return a.id-b.id})的方式做一些事情;但我认为这不起作用,因为1,它不是一个数组(它是一个对象),2,它有那些讨厌的索引(我需​​要代码的另一部分)......

任何想法????

var products = {
    "2": {
        "id": "2",
        "price": "119",
        "quantity": "1",
        "thumb": "img\/store\/comp-08n.png"
    },
    "103": {
        "id": "103",
        "price": "109",
        "quantity": "1",
        "thumb": "img\/store\/basketballhoop.png"
    },
    "1": {
        "id": "1",
        "price": "309",
        "quantity": "1",
        "thumb": "img\/store\/comp-08.png"
    }
};

5 个答案:

答案 0 :(得分:5)

您的订单中需要多少件商品?您可以安全地在Javascript阵列中对10'000个项目进行排序,而不会出现太多速度问题。为什么不使用真正的数组?

您甚至可以为其注入自定义属性,大致类似于

var products = [...];

products.findById = function(id) {
   for (var i=0, len=this.length; i<len; i++) {
      if (id == this[i].id) return this[i];
   }
   return null;
};

alert( products.findById(103).price );   // -> 119

并添加预定义的分拣机,如

products.sortById = function() {
    this.sort(function(a,b) {
        return a.id - b.id;
    });
};

products.sortById();   // sort array by product id

** 编辑 **

在你的PHP方面,你可能会有类似的东西:

$products = array(
    2 => array( 'id' => 2, ... ),
    103 => array( 'id' => 103, ... ),
    1 => array( 'id' => 1, ... ),
);

// get a JSON array
$jsonArray = json_encode(array_values($products));

将返回您需要的内容。

** 注意 **

在阵列中添加新项目时,不应显式设置索引。使用数组的push函数,如

products.push({id:123, price:200.49, quantity:1, thumb:'/path/to/file'});

删除项目有点棘手,例如:

products.removeById = function(id) {
   for (var i=0, len=this.length; i<len; i++) {
      if (id == this[i].id) return this.splice(i, 1)[0];
   }
   return null;
};

products.removeById(123);    // -> returns the removed element! or null if nothing was removed

请参阅演示here(使用Chrome开发工具进行控制台输出)。

答案 1 :(得分:4)

JavaScript和JSON中有两种类型的集合:

  1. 键/值映射(对象) - 无序集合和
  2. 数组 - 索引/值映射(数组) - 有序集合。
  3. 根据定义,只能对数组进行排序。使用数组。

答案 2 :(得分:2)

递归解决方案,但不处理数组,javascript

var alphabetizeJSON = function(obj){
    var key,
        array = [],
        stringifiedValuesObj = {},
        jsonKeyVal = "",
        i,
        keyName;

    for (key in obj) {
        if (typeof obj[key] === "object"){
            stringifiedValuesObj[key] = "" + alphabetizeJSON(obj[key]);
        } else {
            obj[key] = obj[key].replace(/\"/gi,'\\\"');
        }
        array.push(key);
    }

    array.sort();

    for (i = 0; i < array.length; i++){
        keyName = array[i];
        jsonKeyVal += '"' + keyName + '": ';
        jsonKeyVal += stringifiedValuesObj[keyName] ? stringifiedValuesObj[keyName] : '"' + obj[keyName] + '"';
        if (i < array.length - 1 ) {
            jsonKeyVal += ',';
        }
    }

    return '{ ' + jsonKeyVal + '}';
};

答案 3 :(得分:0)

查看JSONArray s。它们可能就是你所需要的。 http://json.org/java/

答案 4 :(得分:0)

事实上,你应该可以使用数组而不是对象来完成这项工作,这将解决你的很多困难。

如果你不能这样做,你可以将对象转换成一个数组来给它排序......就像这样:

var a = []
for (var p in obj) {
  a[+p] = obj[p]
}

如果你不能这样做,你可以按照你想要的顺序动态地将信息添加到页面中(以下是一个坏主意)......

for (var i = 0; i < 10000; i++) {
  if (obj[i] !== undefined) {
    add_to_page(obj[i])  //define this somewhere
  }
}