在Javascript中遍历JSON表

时间:2019-04-19 13:15:04

标签: javascript json

我正在尝试将外部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键的值。很简单,不起作用。

1 个答案:

答案 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'

很容易检查JS中的字符串

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);