【问题标题】:How to access fields in JSON object by index如何通过索引访问 JSON 对象中的字段
【发布时间】:2016-09-03 14:31:07
【问题描述】:

我知道这不是最好的方法,但我别无选择:(

我必须通过索引访问 JSONObject 中的项目。访问对象的标准方法是写this[objectName]this.objectName。我还找到了一种获取 json 对象内所有字段的方法:

(for (var key in p) { 
  if (p.hasOwnProperty(key)) { 
    alert(key + " -> " + p[key]); 
  } 
} 

(来源:Loop through Json object)。

但是,无法通过索引直接访问 JSON 字段。我现在看到的唯一方法是创建一个数组,使用上面的函数,通过索引获取字段名,然后通过字段名获取值。

据我所见,p(在我们的例子中,JSON 文件必须是一个可迭代的数组,否则 foreach 循环将不起作用。我怎样才能直接访问这个数组?或者它是某种未排序的列表?

【问题讨论】:

  • 为什么必须通过索引访问项目?你所写的是如何遍历一个对象,这就是你所拥有的——将它更改为一个数组并不能提供相同的信息。
  • 嗨,我无法以任何其他方式获取数据,所以我以某种方式通过索引访问它们(想法是显示在所有字段为一列的表中),因为我们想使用与其他对象的格式相同(我们通过字段名访问它们),我必须找到一种通过索引来特定访问数据的方法:(。如前所述,我首先创建一个字段名数组,然后通过索引访问它们,但我想摆脱这种不正当行为:P
  • 为什么不在迭代之前有一个变量索引,然后用它来下订单?像 var i 之前的 for 循环,和里面的 i = i + 1?

标签: javascript json


【解决方案1】:

JSON 对象更像是键值映射;所以,是的,它是未排序的。唯一的解决方法是您已经提到的 index->​​property name map:

var keysbyindex = Object.keys(object);
for (var i=0; i<keysbyindex.length; i++)
    alert(object[keysbyindex[i]]);

但是为什么需要这些索引呢?未排序的地图也没有长度属性,就像数组一样。为什么不使用 for-in-loop

var counter = 0; // if you need it
for (var key in object) {
    alert(object[key])
    counter++;
}

?如果你有一个解析过的 JSON 对象,即一个普通的 JS 对象,你就不必担心可枚举的原型属性。

【讨论】:

    【解决方案2】:

    基于 Bergis anserwer 这是我的解决方案:

    var keysbyindex = Object.keys(this);
    alert(this[keysbyindex[index]]);        
    return this[keysbyindex[index] || ""];
    

    但是,我认为(未经测试)它在性能方面非常糟糕,不应该使用!但是危急时刻需要绝招......

    【讨论】:

      【解决方案3】:

      如果不创建自己的 JSON 解析,我认为您实际上无法实现这一点。你正在写你想通过一个 JSON 对象,但你实际上想要做的是通过一个普通的旧 Javascript 对象。 Json 只是用于传输/存储所述对象的字符串表示形式,主要问题在这里:将字符串转换为实际对象的解析器(即大多数情况下的浏览器)可以选择忽略它找到的顺序如果需要,可以使用这些属性。此外,众所周知,不同的浏览器可能有不同的解析 JSON 的方法。如果他们只是对对象使用哈希映射,则很容易循环遍历它,但顺序将不依赖于文件中键的顺序,而是依赖于键本身。

      例如,如果您有 json {"b":"b","a":"a"} 并执行 for in 循环,则在某些实现下您可能会以 comming 先结束,而在其他实现中您可能会以 b 结束。

      【讨论】:

      • 是的,这是真的。然而,我从未见过不按符号顺序执行 for-in-loop 的实现,你知道不同的吗?
      【解决方案4】:

      var jsn = {keyName: 'key value result come here...'};
      var arr = jsn ? $.map(jsn, function (el) { return el }) : [0];
      
      console.log(arr[0])
      $('.result').text(arr[0]);
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
      <span class="result"></span>

      【讨论】:

        猜你喜欢
        • 2019-01-11
        • 1970-01-01
        • 1970-01-01
        • 2017-04-15
        • 2023-01-09
        • 2019-02-13
        • 1970-01-01
        • 2019-12-01
        • 1970-01-01
        相关资源
        最近更新 更多