如何对对象的JS对象进行排序?

时间:2013-01-11 21:07:53

标签: javascript json sorting jsobject

我在PHP中构建了一个对象,使用了JSON_encode函数并通过ajax将其作为JSON字符串发送到我的JS脚本。然后我将它转换回一个对象。我遇到的问题是我想按照最初创建的顺序保留对象。请将这个对象看成是什么,一旦我进入JS,就会看到这个图片:

enter image description here

当我创建对象时,它按字母顺序按客户字段排序。以A开头的客户名称将首先出现,B秒等等。正如您所看到的,现在,对象的第一个元素是以S开头的客户。看起来它以某种方式按照顶层的键自动排序对象,这是一个整数,所以我理解为什么会这样。

所以我想做的是重新排序这个对象,以便按字母顺序按customer字段对所有子对象进行排序。这可能吗?如果是这样,我该怎么做?

谢谢!

5 个答案:

答案 0 :(得分:10)

我已更改Fabricio Matée回答以变得更灵活并返回已排序的对象。

function alphabetical_sort_object_of_objects(data, attr) {
    var arr = [];
    for (var prop in data) {
        if (data.hasOwnProperty(prop)) {
            var obj = {};
            obj[prop] = data[prop];
            obj.tempSortName = data[prop][attr].toLowerCase();
            arr.push(obj);
        }
    }

    arr.sort(function(a, b) {
        var at = a.tempSortName,
            bt = b.tempSortName;
        return at > bt ? 1 : ( at < bt ? -1 : 0 );
    });

    var result = [];
    for (var i=0, l=arr.length; i<l; i++) {
        var obj = arr[i];
        delete obj.tempSortName;
        for (var prop in obj) {
            if (obj.hasOwnProperty(prop)) {
                var id = prop;
            }
        }
        var item = obj[id];
        result.push(item);
    }
    return result;
}

然后只需调用这个函数

your_object = alphabetical_sort_object_of_objects(your_object, 'attribute_to_sort');

答案 1 :(得分:2)

这可能是JavaScript对象和JavaScript数组之间的区别。对象更像是哈希表,其中键没有按任何特定顺序排序,而数组是值的线性集合。

在后端,确保编码数组而不是对象。检查最终编码的JSON,如果您的对象集合被{}而不是[]包围,则它被编码为对象而不是数组。

你可能会遇到问题,因为看起来你正试图通过ID号访问对象,这就是你希望这些对象在最终数组中占据的索引,这会带来另一个问题,因为你可能不会当你只存储少量数值时,我们不希望有一个包含40,000个条目的数组。

如果您只想迭代对象,则应确保编码数组而不是对象。如果要按特定ID访问对象,则可能必须对客户端对象进行排序(即从JSON响应中获取对象,然后创建另一个数组并将这些对象排序到其中,这样您就可以已排序的对象,仍然可以通过id)访问它们。

您可以通过Google轻松找到有效的排序算法(或使用以下ELCas中的算法)。

答案 2 :(得分:1)

这是一个通用的迭代函数,它将所有对象推送到一个数组中,并以不区分大小写的方式按它们的customer属性对它们进行排序,然后迭代排序的数组:

function iterate(data) {
  var arr = [];
  for (var prop in data) {
    if (data.hasOwnProperty(prop)) {
      var obj = {};
      obj[prop] = data[prop];
      obj.tempSortName = data[prop].customer.toLowerCase();
      arr.push(obj);
    }
  }
  arr.sort(function(a, b) {
    var at = a.tempSortName,
        bt = b.tempSortName;
    return at > bt ? 1 : ( at < bt ? -1 : 0 );
  });

  for (var i = 0, l = arr.length; i < l; i++) {
    var obj = arr[i];
    delete obj.tempSortName;
    console.log(obj);
    for (var prop in obj) {
      if (obj.hasOwnProperty(prop)) {
        var id = prop; //gets the obj "index" (id?)
      }
    }
    console.log(id);
    var item = obj[id];
    console.log(item.customer);
    //do stuff with item
  }
}

Fiddle

答案 3 :(得分:0)

sortObject(object){
    if(typeof object === 'object'){
        if(object instanceof Date){
            return object;
        }
        if(object instanceof Array){
            return object.map(element => this.sortObject(element));
        } else {
            return Object.keys(object).sort().reduce((result, key) => {
                if(object[key] && object[key] !== null) {
                    result[key] = this.sortObject(object[key]);
                }
                return result;
            }, {});
        }
    }
    return object;
}

答案 4 :(得分:-2)

只需循环浏览数据并对其进行排序即可。我没有使用最有效的分拣机,但这些想法就在那里。

var data = toArray(AJAX_Returned_JSON); // function to convert object to array
var sortedData = null;

for(var i=0; i<data.length - 1; i++){
  var temp = data[i];
  for(var j=i+1; j<data.length; j++){
    if(data[j].customer < temp.customer){
      temp = data[j];
    }
  }

  sortedData.push(temp);
}