我知道这不是最好的方法,但我别无选择:(
我必须通过索引访问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循环不起作用。如何直接访问此数组?或者它是某种类型的未分类列表?
答案 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>