我正在尝试将外部JSON表“导入”到Javascript中,以便可以对其进行迭代。当前的结果是,我得到[Object object]
的东西,无论我无法达到期望的值。
我的设置:
index.html
/js-
core.js
languages.js // <- same as below, but in js
languages.json
index.html:
<script src="js/languages.js"></script>
<script language="javascript" src="js/core.js"></script>
languages.js:
var data = {
"languages" : [{
"english" : {
"dontRefresh" : "Do not refresh the page!",
"..." : "...",
},
"russian" : {
...
},
}]
}
我尝试了以下操作,并且本地服务器崩溃了,因为它只是无限输出“ D”。
var langs = data;
function walk(obj) {
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
var val = obj[key];
console.log(val);
walk(val);
}
}
}
walk(langs);
最有效的方法是这样:
var langs = data;
console.log(data.languages); // >[Object object] ("english:{}, russian:{}" I suppose)
console.log(data.languages.english); // >[Object object] ("dontRefresh":"...",} I suppose)
// BUT
console.log(data.languages.english['dontRefresh']); // > Undefined
我想要实现的是获取dontRefresh键的值。很简单,不起作用。
答案 0 :(得分:0)
从根本上讲,您的问题很简单,就是假设字符串不可迭代。 以这个为例,
let string = 'abc';
for (key in string)
console.log(key);
// 0
// 1
// 2
// formatUnicorn
// truncate
// splitOnLast
// contains
意识到您的问题了吗?没有?
好吧,让我们进行第一个迭代,其中key
是'0'
。 string.hasOwnProperty('0')
返回true吗?是的。
这意味着我们将递归调用string[0]
上的walk。什么是string[0]
? 'a',另一个STRING!
从本质上讲,当您将字符串传递给walk算法时,将无限迭代字符串的第一个字符。幸运的是,使用typeof
运算符(mdn):typeof 'string' === 'string'
:
var data = {
"languages" : [{
"english" : {
"dontRefresh" : "Do not refresh the page!",
"funFact" : "kittens are nutritious!!!",
},
"russian" : {
},
}]
}
function walk(obj) {
if (typeof obj === 'string')
console.log(obj);
else
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
var val = obj[key];
walk(val);
}
}
}
walk(data);