【问题标题】:Sorting associative array of objects in javascript在javascript中对对象的关联数组进行排序
【发布时间】:2018-04-01 15:16:47
【问题描述】:

我在 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); 
});

显然它返回一个错误。 我该怎么做?

【问题讨论】:

  • 你有一个对象,对象的属性不能排序。如果你想这样做,columns 需要是一个数组。
  • 为什么你在整数上做parseFloat?那么最好使用parseInt
  • 无法对对象进行排序,但您可以创建一个对象数组,如下所示stackoverflow.com/questions/1069666/…
  • @kevinSpaceyIsKeyserSöze 只是复制粘贴问题。
  • 我不知道那是什么意思。 JS 没有关联数组的等价物。有对象(即上面代码中的内容)和数组。对象的属性是瞬态的,不能排序。

标签: javascript jquery sorting datatables associative-array


【解决方案1】:

您只能在数组上使用.sort,因为它是Array.prototype 方法(MDN)。因此,作为一个最简单的解决方案,我更愿意将您的 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()方法可以被链式调用。

【讨论】:

  • 它有效,但我必须重写所有其他代码:(
  • 我在答案中添加了一些代码,以使该过程适用于columns 对象。
  • 是的...感谢分享这个解决方案,它在这里也很好用!!!
猜你喜欢
  • 1970-01-01
  • 2011-05-01
  • 2019-01-08
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多