如何通过索引访问JSON对象中的字段

时间:2012-03-19 09:58:50

标签: javascript json

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

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

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

(Soruce:Loop through Json object)。

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

据我所知,p(在我们的例子中,JSON文件必须是可迭代的数组,否则foreach循环不起作用。如何直接访问此数组?或者它是某种类型的未分类列表?

4 个答案:

答案 0 :(得分:8)

JSON对象更像是键值映射;所以,是的,它是未分类的。要解决的唯一方法是你已经提到的index->属性名称映射:

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

但为什么你需要这些索引?未排序的映射也没有长度属性,就像Array一样。为什么不使用for-in-loop

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

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

答案 1 :(得分:2)

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

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

然而,我认为(未经测试)它的性能极差,不应该使用!但绝望的时候需要采取绝望的措施......

答案 2 :(得分:1)

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

例如,如果您有json {"b":"b","a":"a"}并执行for循环,那么在某些实现中,您可能最终会先进行提交,而在其他实现中,您可能会以b结尾。

答案 3 :(得分:0)

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>