【问题标题】:How to rearrange attributes of an object?如何重新排列对象的属性?
【发布时间】:2018-11-12 14:00:11
【问题描述】:

我有一个这样的对象:

user = {
  'a': 0,
  'b': 1,
  'c': 3,
  'd': 4
}

我想像这样重新排列它的属性:

user = {
  'c': 3,
  'a': 0,
  'b': 1,
  'd': 4
}

我不想创建新对象,而是想重新排列现有对象的属性。

【问题讨论】:

  • 对象中的一组属性实际上并没有可靠的顺序。它通常基于将属性添加到对象的事件序列,但即使这样也是任何类型的编码实践都基于的非常脆弱的行为。
  • 如果你想要一个定义的排序,你可以使用一个附加数组来根据你的需要对属性进行排序,然后在通过Object.keys()获取属性名称后通过该数组对给定对象中的属性进行排序.
  • “出于某些原因” - 你能详细说明它们是什么吗?这可能是xyproblem.info
  • 说你希望 user.c 出现在 user.a 之前有点像你希望 document.getElementById 出现在 document.querySelector 之前。在对象的上下文中,它没有意义。如果需要排序,请使用数组(可能是对象)来构造数据。

标签: javascript json angular


【解决方案1】:

在 JavaScript 对象中,您不能真正对键/值对进行排序。它们以自己的内部格式存储,因此永远不能真正依赖排序。

我不确定您的确切用例是什么,但是如果您需要保证某些字段的顺序,您可以创建一个数组,其中包含您需要的顺序的字段名称,并使用它来遍历对象并获取您需要的值。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    您不能在普通对象中定义键的顺序。您可以做的是将Object 转换为Map

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map

    Map 对象按插入顺序迭代其元素——for...of 循环为每次迭代返回一个 [key, value] 数组。

    var user = {a: 0, b: 1, c: 3, d: 4};
    var uMap = new Map([['c', user.c], ['a', user.a], ['b', user.b], ['d', user.d]]);
    

    或者,您可以将您的 Object 转换为 Array 并使用它。这种方法的缺点是你必须记住属性的正确索引位置/什么属性对应于数组中的哪个位置:

    var user = {a: 0, b: 1, c: 3, d: 4};
    var uArr = [user.c, user.a, user.b, user.d];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-10
      • 2012-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-31
      • 1970-01-01
      相关资源
      最近更新 更多