在javascript中对对象的关联数组进行排序

时间:2017-10-20 12:39:59

标签: javascript jquery sorting datatables associative-array

我在js中有一个特定的对象数组,表示一个表的列。 我的目标是:

var columns = {
  "image": {
    "show": false,
    "orderable": true,
    "value": 0,
    "displayOrder":2
  },
  "name": {
    "show": true,
    "orderable": true,
    "value": 1,
    "displayOrder":0
  },
  "company": {
    "show": false,
    "orderable": false,
    "value": 2,
    "displayOrder":1
  }
}

我必须通过" displayOrder"来订购对象,但是使用像

这样的函数
columns.sort(function(a, b) {
  return parseFloat(a.displayOrder) - parseFloat(b.displayOrder); 
});

显然它会返回错误。 我怎么能这样做?

1 个答案:

答案 0 :(得分:6)

由于.sort方法(MDN),您只能在数组上使用Array.prototype。因此,作为一种最简单的解决方案,我会考虑将您的columns数据从对象改为数组:

var columnList = [
    {
      "key": "image",
      "value": {
          "show": false,
          "orderable": true,
          "value": 0,
          "displayOrder":2
      }
    },
    {
      "key": "name",
      "value": {
          "show": true,
          "orderable": true,
          "value": 1,
          "displayOrder":0
      } 
    },
    {
      "key": "company",
      "value": {
          "show": false,
          "orderable": false,
          "value": 2,
          "displayOrder":1
      } 
    }
];

var result = columnList.sort(function(a, b) {
    return parseFloat(a.value.displayOrder) - parseFloat(b.value.displayOrder);  
});

console.log(result);

console.log的结果恰好是

0:{key: "name", value: {…}}
1:{key: "company", value: {…}}
2:{key: "image", value: {…}}

此转换(从objectarray)可以通过Object.keys以编程方式完成:

result = Object.keys(columns)
  .map(c => ({ key: c, value: columns[c]}))
  .sort((a, b) => a.value.displayOrder - b.value.displayOrder)

此处columns是您的初始对象。在Object.keys().map()的帮助下,我将其转换为我之前描述的数组,因此可以在链中调用.sort()方法。