【问题标题】:Rename javascript object key重命名 javascript 对象键
【发布时间】:2013-08-21 12:56:24
【问题描述】:

我有一个像这样的多维对象:

var elements = {
    front: {
        "1": {
           "backgroundImage": "url(images/elements/pig.png)",
        },
        "2": {
           "backgroundImage": "url(images/elements/star.png)",
        },
        "3": {
           "backgroundImage": "url(images/elements/fish.png)",
        }
    },
    top: {},
    left: {},
    right: {}
};

我需要切换这个对象中的两个元素,所以我这样做:

var temp = elements[front][2];
elements[front][2] = elements[front][3];
elements[front][3] = temp;

这给了我(切换鱼和星 - 但只有属性而不是对象键):

var elements = {
    front: {
        "1": {
           "backgroundImage": "url(images/elements/pig.png)",
        },
        "2": {
           "backgroundImage": "url(images/elements/fish.png)",
        },
        "3": {
           "backgroundImage": "url(images/elements/star.png)",
        }
    },
    top: {},
    left: {},
    right: {}
};

如何重命名对象键?

想要的结果:

var elements = {
    front: {
        "1": {
           "backgroundImage": "url(images/elements/pig.png)",
        },
        "3": {
           "backgroundImage": "url(images/elements/fish.png)",
        },
        "2": {
           "backgroundImage": "url(images/elements/star.png)",
        }
    },
    top: {},
    left: {},
    right: {}
};

【问题讨论】:

  • 想要的结果和你原来的对象一样。属性未排序。如果您希望图像按特定顺序排列,则必须使用数组。
  • @FelixKling 我知道他们没有订单,但我稍后在循环中使用这个对象来渲染 html 中的背景图像 - 属性一个接一个地渲染,假订单很重要对我来说。
  • 那么,您正在使用for...in 循环来迭代属性吗?它们的迭代顺序因浏览器而异。你想做的事情在技术上是不可能的。
  • 不是真的 - 我稍后会将它填充到一个数组中 - 这只是一些简化的代码 - 我的主要问题是如何在一个对象中切换两个键名。我知道如果我这样做可能会出现的所有问题。
  • 问题是你没有切换任何东西。原始对象与您想要的对象完全相同。属性在对象中没有位置,因此{a:1, b:2}{b:2, a:1} 相同。仅当您想要获取现有属性值并将其分配给新属性名称时,“重命名”属性才有意义。但是您没有这样做,您的name -> value 映射保持不变。

标签: javascript object key


【解决方案1】:

您想对对象中的键进行排序,但您不能这样做,因为对象没有顺序。这就是 JavaScript 规范所说的。

如果您依赖排序,在某些情况下会发生意想不到的事情。

在 Chrome 中,如果你定义这个对象:

var a = {
    a: "b",
    1: 2
};

你会得到

var a = {
    1: 2,
    a: "b"
};

相反(这是同一个对象,因为同样,对象没有顺序)。

for .. in 对象上的循环非常具有误导性,因为您认为它们有一个顺序,但实际上您可以编写一个有效的 JavaScript 实现,每次执行 for .. in 时随机化顺序

如果您想以特定顺序迭代您的键,例如:按字母顺序或自然排序,您首先必须将您的对象转换为一个数组(它确实有一个顺序),然​​后对其进行迭代。

你可以想象这样一个函数:

object_iterate(my_object, function (key, value) {
    // do things
}, natural_order_key_sort);

【讨论】:

  • 我不想对键进行排序——我只想问如何重写键名——我的代码重写了对象的所有内容,除了它的名称——我该如何定位它的名字和重命名它?
  • 没有重命名。您可以通过delete obj["property name"]删除一个键,并通过普通分配设置它。同样,没有排序。
  • 明白了 - 现在实际上解决了这是另一种方式,所以这个问题现在很愚蠢,但如果有人偶然发现与我相同的问题,我会离开它。
猜你喜欢
  • 2011-06-06
  • 1970-01-01
  • 2020-10-14
  • 2015-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多