【问题标题】:Is associative array element the same as an object field?关联数组元素是否与对象字段相同?
【发布时间】:2011-01-25 09:59:35
【问题描述】:

我有一个看起来像这样的对象。

var obj = {
    speed: 10,
    volume: 14,
    aux_deform: 1.8,
    energy: 21.5,
    aux_energy: 0.2
}

将在运行时添加额外的字段/属性,因此对象可以在任何给定时间包含任意数量的属性。正如您在我的对象示例中看到的,某些属性可以以“aux_”开头。

现在,我想从这个对象创建另一个对象,它只包含以“aux_”开头的属性。

我现在的做法是这样的。

var newObj = [];
for(prop in obj)
{
    if (prop.startsWith('aux_'))
    {
        newObj[prop] = obj[prop];
    }
}

现在我有了一个新对象,我可以执行以下操作:

alert(newObj.aux_energy);

这工作正常,但我想知道这是否是正确的方法。对于我想要实现的目标,有没有更简单的方法或更优雅的方法?这种创建对象的方式是否存在任何(安全或技术)问题?

标题中的问题是:新创建的对象实际上是一个以属性为键的关联数组(因为它是这样创建的)还是有什么区别。

【问题讨论】:

  • 在 JS 中没有关联数组这样的东西。

标签: javascript json associative-array


【解决方案1】:

Java Script 中没有关联数组,只有 JSON 对象可以用来代替关联数组。您在这里所做的是声明了一个名为 newObj 的数组,然后向该数组添加了属性。尝试在 Array 方法中使用 buit 或对其进行迭代时,可能会导致意外行为。 JSON 对象和数组之间的主要区别在于,对象中的属性不可排序,对它们进行迭代会产生随机且不可预测的输出。

更合适的写法是声明一个对象newObj = {},然后复制你需要的属性。

需要注意的一点 - 如果您将数组或对象作为属性值,您将复制对这些对象的引用。如果您希望能够独立于原始对象编辑这些值,则必须深度复制这些值 - 请查看此问题以了解如何在 What is the most efficient way to deep clone an object in JavaScript?

除此之外,这是唯一的方法,而且非常好。

【讨论】:

  • 是的,我知道参考分配。感谢您的输入。这正是我所需要的。
猜你喜欢
  • 2014-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多