【问题标题】:Set associative array value in array在数组中设置关联数组值
【发布时间】:2012-01-04 02:44:10
【问题描述】:

这看起来很简单,但我想不通。

在 PHP 中,我可以这样做:

$number_children[reference_number - 1][$key] = value;

在 Javascript 中,我需要做同样的事情:在关联数组中设置一个值,该数组位于普通数组中。

我试过这个:

number_children[reference_number - 1][key] = $(this).val();

这似乎不起作用。设置此值的简单方法是什么?

提前感谢您的帮助。

【问题讨论】:

  • “很明显?”实际上,它应该工作。请让我们看看您的代码的其余部分吗?
  • “不起作用”是什么意思?您的浏览器是否显示任何错误?
  • 我敢打赌,您将 number_children[i] 定义为普通数组,而不是对象:[] 而不是 {}
  • @Idiqual:完全没有区别,节省一点内存浪费。
  • PHP 有自动激活功能吗? (我不会用PHP,但我知道JS不会。)

标签: javascript jquery


【解决方案1】:

你在初始化数组吗?:

number_children = [];
number_children[reference_number - 1] = {};
number_children[reference_number - 1][key] = $(this).val();

也许 jsFiddle 可以帮助显示问题。

【讨论】:

  • +1 是唯一明确提到初始化数组/对象的答案。
【解决方案2】:

在 Javascript 中数组和“关联数组”是不同的。事实上,Javascript 人不使用术语“关联数组”,他们称它们为“对象”(或“哈希”)。

所以,你可以这样做:

number_children[reference_number - 1] = {};
number_children[reference_number - 1][key] = $(this).val();

但是当你尝试迭代它时,这可能会产生意想不到的结果,因为 length 没有被设置:

number_children[reference_number - 1] = [];
number_children[reference_number - 1][key] = $(this).val();

【讨论】:

  • 数组和“关联数组”在 JS 中没有区别。 JavaScript 中的所有数组都只是具有特殊重载的[]=length 的对象(因此也是关联数组或映射)。但是,我强烈建议保持 ADT 和用法不同。 JS 在这方面的帮助比 PHP 多一点,尽管它可以被任何方式滥用,因为 Array 是 Map 的 子类型
  • 我稍微简化了图片。 :-)
  • 为什么不能做后者?您也可以在数组中设置任意键名。一切都是对象。
  • 嗯,你可以,但是当你稍后迭代数组时,它会显示为空。这对初学者来说可能是一个惊喜:-)
  • 所以这里真正的答案是任何一个选项都可以使代码工作,因为主要是你必须实际设置number_children[reference_number - 1] 等于某种对象,之前有... = {}... = []您可以使用number_children[reference_number - 1][key] = ... 在其上设置属性(数组和其他对象之间的区别是次要问题。)
【解决方案3】:

在 JavaScript 中没有关联数组这种东西。

在 PHP 中,您只有数组,可以是数字的、关联的或混合的。在 JavaScript 中,您有数组或对象。 JavaScript 中的数组不是关联的。

如果number_children 是一个对象数组,那么您的代码就完美了。这意味着如果这是数组,其中包含对象,而在您的示例中,这些对象又具有名为 key 变量的值的属性。

【讨论】:

  • associative array 也称为 Map(或 Hash),它是 JavaScript 中对象的属性。出于这个原因,我更喜欢术语“映射”,并且良好的编码要求数组对象像数组一样使用,但是在 JS 中很容易模糊这条线:)
  • @pst:所以基本上你是说“associative array”在 JavaScript 中是“object”(但首先让我们将new Array()new Object())?
  • 没错。 JavaScript 中的所有对象都作为关联数组(或映射)使用,映射为 String -> Any。 JavaScript 中的数组是对象的特殊子类型。 [] instanceof Array[] instanceof Object 都是真的。 {} instaneof Array 是假的。
  • “区别”是数组(-object)有一个特殊的[]= 操作符,它更新length 属性(并且还可以很好地访问数组原型,所以push 等可以调用他们)。但是,它仍然是 String -> Any 的 Map,这就是为什么 for (var i in someArray)“经常出错”的原因,因为它不会迭代从未分配过值的索引(属性)。 for (..in..) 在对象中迭代 properties,其中确实包括为数组(-objects)分配的索引(属性):-)
  • @pst:好的,所以让我清楚我想说什么:) 通过“array”我理解Array 的实例,并且通过“object" 我理解Object 的实例,这不是Array 的实例。许多人在开始使用 JavaScript 编码并且只有 PHP 经验时面临的问题是:期望 Array ([]) 的实例在 PHP 中的行为。因此,我将关联数组与“数字”数组区分开来。这是我回答的主要目标。
【解决方案4】:

tl;dr 发布实际问题代码(需要最少的上下文)包括任何错误消息和/或 [意外] 症状。


正如 minitech 所说:代码没有“明显”错误。

无论如何,我刚刚了解到 (TM) PHP has some form of auto-vivification。 JavaScript 绝对自动激活。

因此,

$number_children[reference_number - 1][$key] = value;

应该在 PHP 中工作,假设 $number_children$number_children[x]

  1. 尚未设置。
  2. 之前已设置为“数组”。

由于 JS 像这样工作,那么根据 SpoonNZ 或 Sergio Tulentsev 的回答,object/array 必须在使用 [] 运算符之前显式创建。 (例如,请参阅他们的答案)。

编码愉快。

【讨论】:

    猜你喜欢
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    • 2020-07-04
    相关资源
    最近更新 更多