【问题标题】:Sort object by key values [duplicate]按键值对对象进行排序[重复]
【发布时间】:2017-08-14 13:07:55
【问题描述】:

我被一个对象结构(现在)困住了,我想看看我是否可以尝试排序。我的对象现在看起来像这样 -

{
  "type1" : { 
    "position": 3
  },
  "type2" : { 
     "position": 1
  }
}

我想弄清楚的是,是否有办法重新排序(排序)对象键/值但嵌套位置。所以期望的结果是

{
  "type2" : { 
     "position": 1
  },
  "type1" : { 
    "position": 3
  }
}

那么决定顺序的是对象中的position 值。我正在重构另一个项目以尝试向此列表添加一些排序。我知道如果它是一个对象列表会更容易很多,但这需要我更改很多其他代码,所以我试图找出我是否可以将对象结构保持为是(当然如果可能的话)。感谢阅读!

【问题讨论】:

  • Object keys do not have an ordering。您看到的任何排序都纯粹是实现定义的。
  • 对象属性根据定义是无序的,所以这是不可能的。如果顺序很重要,则需要将其制成数组
  • 酷,谢谢大家的回答。我将关闭它,因为它是一个骗局
  • 然而,您可以做的事情类似于:Object.keys(myObj).sort((a, b) => myObj[a].position - myObj[b].position),以按照您的首选顺序获取一组键。

标签: javascript sorting object


【解决方案1】:

var a = {
  "type1" : { 
    "position": 3
  },
  "type2" : { 
     "position": 1
  }
};

var b = Object.assign(
    ...Object
    .keys(a)
    .sort((x, y) => a[x].position >= a[y].position)
    .map(k => ({ [k]: a[k] }))
);

console.log (b);

【讨论】:

  • 这不起作用,因为它仍然依赖于实现定义的键顺序。 Chrome 最近更改了自己的实现,例如,它破坏了某些网络应用程序中的预期排序。
  • 你能澄清你的评论吗?在我的答案中,对象ab 的顺序不同。并且没有澄清它应该是新对象还是现有对象的重新排序。并且没有指定浏览器或 ES 版本。那你为什么这么说,这个答案并没有涵盖所有情况,而没有指定任何情况?
  • 返回的顺序是实现定义的。您期望它保持插入顺序,但这在 ECMAScript 中并不能保证,并且至少在 Chrome 和 Edge 中肯定并非总是如此。例如,当我在 Edge 中运行您的 sn-p 时,我看到 type1 后跟 type2
  • 好吧,当我在 ie6 上运行它时,它会抛出一个错误,什么?这个选项记录在 ECMAScript 中,浏览器支持是另一个大问题。未指定的大问题。谁知道可能是 ajmajmajma 想在 typescript 或 babel 中使用它。
  • 是的,我有 99% 的把握会这样做
猜你喜欢
  • 2012-01-17
  • 2014-07-09
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
  • 1970-01-01
  • 2023-02-03
相关资源
最近更新 更多