【问题标题】:How can we custom sort JavaScript object keys?我们如何自定义排序 JavaScript 对象键?
【发布时间】:2023-04-01 07:59:01
【问题描述】:

我正在尝试对 JavaScript 对象进行自定义排序,但无法了解如何以正确的方式执行此操作。假设我有一个类似的对象

var test = {
  'yellow': [],
  'green': [],
  'red': [],
  'blue': []
}

我有一个数组,其值为:var arr = ['red', 'green', 'blue', 'yellow'];

所以排序后,我想按照数组中指定的顺序输出

var test = {
  'red': [],
  'green': [],
  'blue': [],
  'yellow': []
}

但由于某种原因,我无法做到这一点。这里要做的是循环和排序,但它以 AZ 模式排序,而不是按照我指定数组的顺序。另外,你可能会问,我什至没有在排序函数中使用我的数组,但没有得到实现这一目标的确切方法。

var test = {
  'yellow': [],
  'green': [],
  'red': [],
  'blue': []
}

var keys = Object.keys(test);

console.log(keys.sort());  //["blue", "green", "red", "yellow"] which is not ordered nor it's an object

任何指示都会对他有所帮助。


注意:我有这个特定的要求,因为我使用带有默认 {{#each}} 块的 HandleBars,但我想按该顺序循环内部对象。我可以循环 Handlebars 中的对象并将它们传递给模板,但我没有使用模板引擎的功能。我想让 Handlebars 循环它们还是我错过了什么?如果我循环对象并将整个标记传递给车把模板是否可以。

【问题讨论】:

  • 对象在 JavaScript 中没有顺序。 “对对象进行排序”是没有意义的。
  • 对象一进入JavaScript,就没有顺序了。为了证明这一点,请在 Chrome 中尝试以下操作:console.dir({b:1,a:2}) - 您将得到 {a:2,b:1} 作为输出,因为 Chrome 按字母顺序显示带有键的对象以便于调试。它可以做到这一点,因为对象缺乏内在的顺序。
  • @FelixKling 您标记的问题不一样,即正常排序,我要求的是自定义排序。在问这个问题之前我确实搜索过。请在关闭之前阅读问题。
  • 这是一个人试图解决问题 A,决定采取行动 B,陷入困境,然后试图寻求 B 的帮助,而不是寻求 A 的帮助。 @Learner,您应该为您的问题 A 寻求帮助,这似乎类似于“如何在 Handlebars 模板中显示我的 JS 对象内容,已排序”。
  • @guest271314:当然,但前提是事先知道订单(这里就是这种情况)。但这也只有在接收数据的函数知道如何处理Maps 时才有效。再说一次,如果是您的代码遍历 Map,您不妨遍历键数组并简单地按该顺序访问对象属性。

标签: javascript sorting handlebars.js javascript-objects


【解决方案1】:

也许你可以使用 JSON.stringify() 来改变它

喜欢

var json = {     "name": "David",     "age" : 78,     "NoOfVisits" : 4   };
console.log(json);
//outputs - Object {name: "David", age: 78, NoOfVisits: 4}
//change order to NoOfVisits,age,name

var k = JSON.parse(JSON.stringify( json, ["NoOfVisits","age","name"] , 4));
console.log(k);
//outputs - Object {NoOfVisits: 4, age: 78, name: "David"} 

把你想要的键顺序放在一个数组中并提供给函数。然后将结果解析回json。

【讨论】:

    【解决方案2】:

    你可以使用Map()

    Map 对象按插入顺序迭代其元素

    var arr = ['red', 'green', 'blue', 'yellow'];
    
    var map = new Map();
    
    arr.forEach(function(val, index) {
      var obj = {};
      obj[val] = [];
      map.set(index, obj)
    });
    
    console.log(map)

    【讨论】:

    • 为什么不map.set(index, []) ?不确定我是否理解var obj = {}; obj[val] = []; 的意思。此外,这仅在接收代码知道如何处理 Maps... 时才有效
    • @FelixKling 只是注意到一种可能的方法。 js 发帖不准确吗?
    • 谢谢,但我认为地图在 IE 中的支持不好
    • @Learner 是的,好久没用ie了;必须提醒自己,许多人仍在使用 ie
    【解决方案3】:

    JavaScript 对象是散列,因此本质上是无序的。您不能以任何给定的顺序制作具有属性的对象。如果您在枚举键时收到命令,那纯属巧合,或者更好地说,是 JavaScript 引擎的实现细节。

    您必须使用对象数组来实现您想要做的事情。

    换句话说,你选择的数据结构是不可能的。

    【讨论】:

    • 正如我所说,我正在使用 Handlebars,我使用 each 循环一个对象,但我想按上述顺序循环它,所以我需要为此编写一个帮助程序,并且在助手中生成标记?如果就是这样,那么使用模板就没有意义了,因为所有循环都在我这边运行。
    • 如果你想按顺序循环一些东西,你必须传入一个数组。一个对象不会给你想要的结果。
    • 感谢您的帮助,一旦系统允许我将您的答案标记为正确
    猜你喜欢
    • 2013-02-21
    • 2011-03-23
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    相关资源
    最近更新 更多