如何迭代 json 对象

How to iterate json object

提问人:Kevin Lindmark 提问时间:9/19/2023 最后编辑:mplungjanKevin Lindmark 更新时间:9/19/2023 访问量:31

问:

我有以下json对象,并尝试使用jQuery进行迭代,但它只返回一次迭代。我做错了什么?

var data = "{
  "SIEcat4": {
    "3001": {
      "test": "test",
      "test": "test"
    },
    "3300": {
      "test": "test",
      "test": "test"
    }
  },
  "SIEcat5": {},
  "SIEcat6": {},
  "SIEcat13": {
    "3990": {
      "test": "test",
      "test": "test"
    }
  }
}"




$(JSON.parse(data)).each(function(key, value) {
  console.log("test");
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>

jQuery 对象

评论

0赞 mplungjan 9/19/2023
每个都用于数组..此外,您还有相同的引号来包装对象和引用数据。换行符仅在 JS 中的模板文字中或转义换行符时才允许。因此,将外部更改为并找到如何迭代嵌套对象"`
0赞 freedomn-m 9/19/2023
请阅读:什么是 JSON - 没有“JSON 对象”这样的东西 - 你要么有一个 JSON(字符串)要么有一个对象。

答:

-1赞 Chris Barr 9/19/2023 #1

在您的问题中,您的 JSON 对象被包装在字符串中,这是不对的。如果你有一个对象的字符串表示形式,则必须将其作为一个单独的步骤进行解析。如果你有一个真正的 JSON 对象,那么你可以用它来遍历该对象的键。Object.keys

此外,根本不需要 jQuery。

下面介绍如何循环访问对象中的键和数据

var data = {
  "SIEcat4": {
      "3001": {
          "test": "test",
          "test": "test"
      },
      "3300": {
          "test": "test",
          "test": "test"
      }
  },
  "SIEcat5": {},
  "SIEcat6": {},
  "SIEcat13": {
    "3990": {
        "test": "test",
        "test": "test"
    }
  }
};

Object.keys(data).forEach(key => {
  console.log(key, '=>', data[key]);
});

如果你的数据是 JSON 数据的字符串表示形式,你可以执行与上述完全相同的操作,但你需要先运行它以从字符串中获取数据。JSON.parse

var dataAsString = `{
  "SIEcat4": {
      "3001": {
          "test": "test",
          "test": "test"
      },
      "3300": {
          "test": "test",
          "test": "test"
      }
  },
  "SIEcat5": {},
  "SIEcat6": {},
  "SIEcat13": {
    "3990": {
        "test": "test",
        "test": "test"
    }
  }
}`;

var data = JSON.parse(dataAsString);

Object.keys(data).forEach(key => {
  console.log(key, '=>', data[key]);
});

0赞 mplungjan 9/19/2023 #2

详细说明我的评论

$jQueryCollection.each() 通常用于 jQuery 集合 - 我不会将其用于嵌套对象

$.each 可用于对象,但只能用于一个图层

此外,您还有相同的引号来包装对象和引用数据。换行符仅在 JS 中的模板文字中或转义换行符时才允许。因此,将外部更改为 ' (bactick) 和"

了解如何迭代嵌套对象

最后,您的对象是无效的,因为它有多个名为 same 的键

这是一个有效对象上的工作递归迭代器 - 如果你坚持,它可以在jQuery中使用

const obj = JSON.parse(data);
const iterateObject = (obj, parentKey = '') => {
  for (let key in obj) {
    if (typeof obj[key] === 'object') {
      iterateObject(obj[key], `${parentKey}${key}.`);
    } else {
      console.log(`${parentKey}${key}: ${obj[key]}`);
    }
  }
};

iterateObject(obj);

console.log('\n------\n');

// jQuery .each also needs the iterator
let parentKey = '';
$.each(obj, function(key, value) {
  if (typeof obj[key] === 'object') {
    iterateObject(obj[key], `${parentKey}${key}.`);
  } else {
    console.log(`${parentKey}${key}: ${obj[key]}`);
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>

<script>
  var data = `{
  "SIEcat4": {
    "3001": {
      "test1": "test",
      "test2": "test"
    },
    "3300": {
      "test1": "test",
      "test2": "test"
    }
  },
  "SIEcat5": {},
  "SIEcat6": {},
  "SIEcat13": {
    "3990": {
      "test1": "test",
      "test2": "test"
    }
  }
}`; 
</script>