Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript-获取关联数组中元素的名称_Javascript_Arrays - Fatal编程技术网

JavaScript-获取关联数组中元素的名称

JavaScript-获取关联数组中元素的名称,javascript,arrays,Javascript,Arrays,我有一个JavaScript对象,它被视为一个关联数组。让我们称之为“场”。它有几个要素,例如: fields['element1'] = ... fields['element2'] = ... fields['element3'] = ... 给定字段[0],是否可以获取属性的名称(即“element1”)而不是其值?否,原因有二 字段[0]和字段[“element1”]是不同的属性 对象中的属性显式无序 您可以在属性上循环: function (obj) { for (prop in

我有一个JavaScript对象,它被视为一个关联数组。让我们称之为“场”。它有几个要素,例如:

fields['element1'] = ...
fields['element2'] = ...
fields['element3'] = ...
给定字段[0],是否可以获取属性的名称(即“element1”)而不是其值?

否,原因有二

  • 字段[0]和字段[“element1”]是不同的属性
  • 对象中的属性显式无序
  • 您可以在属性上循环:

    function (obj) {
      for (prop in obj) {
        if (obj.hasOwnProperty(prop) {
          return prop;
        }
      }
    };
    
    …获取“first”的任意值的“first”属性,该值可以随时更改


    解释hasOwnProperty模式。

    没有
    字段[0]
    (除非
    字段
    是一个
    数组
    对象,它支持数字索引),因此您无法获得这样的名称。但你可以这样模拟:

    function getKey(obj, i) {
        var j = 0;
        for (var p in obj) {
            if (j++ == i) return p;
        }
        return null;
    }
    
    for(obj中的var p)
    将循环遍历对象
    obj
    中的每个字段名。通过获取第n个字段名,可以有效地获取某个索引的“键”


    请注意,虽然它正在努力成为一个标准,但根据标准,字段名的顺序目前无法保证,这意味着在修改对象后,相同的函数调用理论上可能返回不同的字段名。同样,不同的浏览器可以返回不同的结果。实际上,你会发现几乎所有的浏览器都保持了字段名的顺序,所以你根本不必担心它。

    只需指出其他人的回答中隐含的内容:Javascript中的“关联数组”实际上只是
    对象
    实例,例如

    var aa = {};
    aa.foo = 'argle';
    alert(aa['foo']); // Will alert 'argle'
    

    请不要使用
    数组
    而不是
    对象
    -它可能会对aa式迭代中的
    键造成严重破坏。

    假设您有一个对象对象。它可以是:

    var oObject = {} ;
    oObject["aaa"] = "AAA" ;
    oObject["bbb"] = "BBB" ;
    oObject["ccc"] = "CCC" ;
    oObject["ddd"] = "DDD" ;
    oObject["eee"] = "EEE" ;
    
    现在,假设您想知道其属性的名称和值,将其放入变量strName和strValue中。为此,请使用“For(x in o)”构造,如下例所示:

    var strName, strValue ;
    
    for(strName in oObject)
    {
       strValue = oObject[strName] ;
       alert("name : " + strName + " : value : " + strValue) ;
    }
    
    “for(x in o)”构造将迭代对象“o”的所有属性,并在每次迭代时将当前属性名放入变量“x”。你所要做的就是,写出o[x]来获得它的值,但你已经知道了

    附加信息 经过一些思考,在看到Hank Gay的评论后,我觉得额外的信息可能会很有趣

    让我们天真一点(忘记“在JavaScript中,所有对象,包括数组,都是关联容器”这一点)

    通常需要两种容器:映射和数组

    映射是按照上面的示例创建的(使用“o=newobject();”或“o={};”表示法),必须通过其属性进行访问

    数组是以不同的方式创建的,即使它们可以作为映射进行访问,也只能通过它们的索引进行访问,以确保保持顺序

    重点是:

    • 如果需要贴图,请使用“new Object()”容器
    • 如果需要数组,请取消对数组的调用,使用“new array()”容器
    • 不要将两者混用,也不要通过索引访问地图,对于数组,总是通过索引访问其数据,因为如果你不遵循这些原则,你将无法得到你想要的

    循环是否按照定义的顺序进行迭代?请参阅我刚才添加到回答中的文本。“实际上,您会发现几乎所有浏览器都保持字段名的顺序”。即使您添加了更多字段?随着对象的修改,新字段名也会添加到列表的末尾。这一点很好。在太多的库中(常用库!)我看到过这样的错误吗?
    something=[]
    something=newarray()
    后跟
    something['key']=123
    。示例包括WMD(此处使用的实时标记编辑器)和jQuery UI。可能值得解释一下
    hasOwnProperty
    的作用。OP可能需要第一个字段,包括在
    prototype
    中定义的字段(但很可能他需要您的方法)请注意,其他答案是正确的,指出迭代顺序不能保证。@Hank Gay:谢谢你的评论。我在答案中添加了这个信息。