【问题标题】:Javascript sort multidimensional objectJavascript排序多维对象
【发布时间】:2014-06-23 08:35:36
【问题描述】:

所以我知道这里有很多帖子描述了如何对多维对象进行排序,但我一直找不到适合我需要的帖子。

所有这些解决方案都基于这样的对象:

[{id: 1, value: 'aaa'},{id: 40, value: 'bbbb'}]

我的对象如下所示:

buttons: {
    confirm: {
        class: 'btn btn-primary',
        value: 'Opslaan',
        order: 1
    },
    cancel: {
        class: 'btn btn-default',
        value: 'Annuleer',
        order: 10
    }
    delete: {
        class: 'btn btn-danger',
        value: 'Verwijder',
        order: 2
    }
},

当然,我想对此进行排序,结果是:确认、删除、取消。 我试过这个(我预计不会工作):

this.options.buttons.sort ( function ( a, b ) {
    return a.order - b.order;
});

但这给了我一个Uncaught TypeError: undefined is not a function

非常感谢任何帮助!

【问题讨论】:

  • 就这么简单:对象没有sort(),对象不保证顺序。
  • 有时候这个网站让我觉得自己像个白痴……哈哈。但这是否意味着没有办法达到我的结果?除了改成数组?
  • @DiederikvandenB 从技术上讲,您可能有一些方法可以对对象进行排序(Object.keys,然后您可以对该数组进行排序,然后您可以重建您的对象)。但是,对象未根据 ECMA 规范进行排序(请参阅:ecma-international.org/publications/standards/Ecma-262.htm),因此不能保证对象会按照您的喜好保持排序。最好将按钮属性转换为数组。

标签: javascript sorting javascript-objects


【解决方案1】:

我有一个非常相似的需求,我最终做了一些类似的事情——

// Code typed on the fly -- untested.
buttons: {
    list: [],  // We'll store things here.
    confirm: {
        class: 'btn btn-primary',
        value: 'Opslaan',
        order: 1
    },
    cancel: {
        class: 'btn btn-default',
        value: 'Annuleer',
        order: 10
    }
    delete: {
        class: 'btn btn-danger',
        value: 'Verwijder',
        order: 2
    }
}


// Now, fill the list from the properties

for (var key in buttons) {
  // Don't actually use the 'list' property in the output
  if (key !== "list") {
    list.push(key);
  }
}

// Now that we have our list, sort it
// Any specialized sorting can be done in the `sort` method here
buttons.list = buttons.list.sort();

// Now, deal with the sorted list
for (var i = 0; i < buttons.list.length; i++) {
  var key = buttons.list[i];
  var button = buttons[key];
  console.log(button);
}

【讨论】:

    【解决方案2】:

    正如@epascarello 提到的,JavaScript 中没有对象的原生排序功能。

    如果您有兴趣按照某种顺序对对象键的数组进行排序,可以使用Object.keys()

    var buttons = {
      confirm: { value: 'foo', order: 0 },
      cancel: { value: 'bar', order: 2},
      delete: { value: 'baz', order: 1}
    };
    
    var sortedButtons = Object.keys(buttons).sort( function(keyA, keyB) {
      return buttons[keyA].order - buttons[keyB].order;
    }); // returns ['confirm', 'delete', 'cancel']
    

    【讨论】:

    • 尽管我将系统更改为数组方法,但我觉得这个答案应该被标记为最佳解决方案,因为它可能对其他人有所帮助。然后可以使用新数组进行循环(例如使用$.each()),然后可以调用对象中的原始值。
    猜你喜欢
    • 1970-01-01
    • 2011-10-29
    • 2017-08-01
    • 2015-07-11
    • 2016-02-07
    • 2011-10-02
    • 2011-10-23
    • 1970-01-01
    相关资源
    最近更新 更多