【问题标题】:Unable to loop through an object in JavaScript无法循环遍历 JavaScript 中的对象
【发布时间】:2019-12-06 19:01:20
【问题描述】:

我对 JS 有点缺乏了解。我正在通过 API 访问一些数据并将其作为 JSON 检索。这些数据非常好地进入 JS。但我真的不明白我正在处理哪种类型的对象。我无法确定长度,其他循环方法也不起作用。但我可以像数组一样使用 REValues[0] 访问对象元素——第一个元素。

function drawTable() {
        debugger;
        var REValues = {{ json|safe }};
        var data = new google.visualization.DataTable();

        data.addColumn('number', 'ID');
        data.addColumn('string', 'Stadt');
        data.addColumn('string', 'Bezirk');
        data.addColumn('number', 'Einkaufswert');
        data.addColumn('number', 'Fläche');
        data.addColumn('number', 'Miete');

        for (var REValue in REValues) {
            debugger;
        }

JSON 响应示例:

{0: {'id': '114294281', 'creation': '2019-11-04T21:29:13.000+01:00', 'city': 'Dortmund', 'quarter': 'Huckarde', 'value': 92000, 'currency': 'EUR', 'livingSpace': 71, 'street': 'Urbanusstraße', 'houseNumber': 'x'}, 1: {'id': '109426963', 'creation': '2019-01-22T12:50:27.000+01:00', 'city': 'Dortmund', 'quarter': 'Huckarde', 'value': 129000, 'currency': 'EUR', 'livingSpace': 59, 'street': 'Roßbachstr.', 'houseNumber': '40 c'}, ...

enter image description here

【问题讨论】:

    标签: javascript json django


    【解决方案1】:

    根据你的 json 字符串,你有一个对象而不是数组。 对象的属性长度可以通过

    let objectLength = Object.keys(REValues).length;
    

    并且可以使用“for in”迭代对象以读取值。

    for (var REValue in REValues) {
        let val =REValues[REValue];
    }
    

    【讨论】:

      【解决方案2】:

      在 javascript 中,for…in 用于迭代对象的属性(对象键)而不是直接迭代其值。尝试使用 for…of 来遍历这些值!

      【讨论】:

      • 如果您可以访问 revalues[0] 并不意味着它是一个数组。 “0”也可以是对象的键。根据你的耆那教字符串,情况就是这样。要获取长度,您可以使用 objectLength = Object.keys(revalues).length.
      【解决方案3】:

      您可以使用它来循环对象-

      for (let key in yourobject) {
         if (yourobject.hasOwnProperty(key)) {
            console.log(yourobject[key]);
         }
      }
      

      请传入对象代替 yourobject 并检查值。

      【讨论】:

        【解决方案4】:

        你得到的数据是一个对象,而 data[0] 返回一个值的原因是因为 0 是对象数据的一个属性。

        如果你想遍历对象属性或获取长度,你可以这样做

        //I am assuming that data holds your object
        let keys = Object.keys( data ) 
        

        遍历这个对象的属性

        for (let k in keys) {
            let value = data[k]
            //now you can console log value or whatever you want to do 
            //(value can be any type of variable including another object)
        }
        

        如果你想知道你的对象有多少属性(长度)

        keys.length()
        

        我没有测试过这段代码,所以它可能有一些打字错误。 如果您需要更多说明,请直接询问您要归档什么,也许有更好的方法。

        【讨论】:

          【解决方案5】:

          过于简单化...如果它以花括号 { 开头,您可能会看到 JSON 对象。如果它以方括号 [ 开头,您可能正在查看 JSON 数组。详细解释见Objects vs. Arrays

          但是,JSON 中的任何数量的格式错误都会使其无效并使其难以(或不可能)进行操作。您提供的示例 不是有效的 JSON。从在 JSON Formatter & Validator 中验证的已知良好 JSON 数组开始可能会有所帮助。

          这是一个简单的例子:

          [
              { "manufacturer":"Ford", "models":[ "Fiesta", "Focus", "Mustang" ] },
              { "manufacturer":"BMW", "models":[ "320", "X3", "X5" ] },
              { "manufacturer":"Fiat", "models":[ "500", "Panda" ] }
          ]
          

          一旦您知道从 API 返回的 JSON 格式正确,就可以更轻松地在您的 UI 中呈现它。

          // valid JSON
          const myArray = [{
              "manufacturer": "Ford",
              "models": ["Fiesta", "Focus", "Mustang"]
            },
            {
              "manufacturer": "BMW",
              "models": ["320", "X3", "X5"]
            },
            {
              "manufacturer": "Fiat",
              "models": ["500", "Panda"]
            }
          ]
          
          //create a new array containing only the manufacturers
          const manufacturers = myArray.map(x => x.manufacturer);
          //expected output => ["Ford","BMW","Fiat"]
          
          // join the new array values in a comma separated string
          console.log("This array contains models from " + manufacturers.join(", ") + ".");

          【讨论】:

          • 是的,我测试了这个 JSON 表达式,但它无效。但是这个对象看起来很漂亮,这就是我把它留下的原因。它来自 Python Dictionary,这就是格式不好的原因。感谢您提供 JSON 与对象链接。
          • 没错。您的既定目标是“确定长度,并且其他循环方法也不起作用”。在您的 JSON 有效之前,这些问题将一直存在。 API 是否有不同的有效响应?如果没有,您可能会继续遇到问题。
          • 是的,API 有不同的有效响应,它对于用例来说太大了。这就是我将所需信息放入字典的原因,因为 API 调用位于 Django 后端。但是现在我可以在 JS 中访问数据了,所以一切都很好。
          • 优秀。如果您在处理 JSON 时遇到任何问题,您可以随时发布一两个数组对象作为示例。有很多有用的array methods
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-14
          • 2013-03-09
          • 2015-09-16
          • 2016-11-18
          • 2016-07-08
          相关资源
          最近更新 更多