我一直在尝试解决这个问题。我已经测试了一些堆栈解决方案来遍历嵌套对象,但是还没有使其正常工作。我的数据结构如下。
我一直试图首先遍历嵌套对象,而这个对象似乎与我的堆栈相似。
Iterate through Nested JavaScript Objects
但是,当我进入for循环时,可以访问geo,value对象以获取其所有属性,ip,主机名,城市等,但是我却空手而未定义。这是我在下面尝试过的代码片段。
我正在尝试获取整个对象中的所有键和值,并将它们字符串化为漂亮的参数字符串,以便在ajax请求中发送给服务器。
for (var i = 0; i < myarray.length; i++) {
var o = myarray[i];
if (o.name === "geo") {
o.value.ip;
}
}
0: {name: "firstname", value: "John"}
1: {name: "lastname", value: "Smith"}
2: {name: "email", value: "asddas@gmail.com"}
3: {name: "password", value: "asdsdadasads"}
4: {name: "paypal_email", value: "asdsa@gmail.com"}
5: {name: "phone", value: "1234567894"}
6: {name: "geo",value: "
{"ip":"111.111.111.111","hostname":"rr.com","city":"MyCity","region":"Ohio","country":"US","loc":"41.34.23","org":"Inc","postal":"1234","timezone":"America/New_York","readme":"https://www.google.com"}"
__proto__: Object
length: 7
__proto__: Array(0)
答案 0 :(得分:1)
问题在于geo
对象的结构很奇怪:
name: "geo",value: "{"ip":"111.111.111.111","hostname":"rr.com","city":"MyCity","region":"Ohio","country":"US","loc":"41.34.23","org":"Inc","postal":"1234","timezone":"America/New_York","readme":"https://www.google.com"}"
该值似乎是JSON表示法中的 string 。您必须先对其进行解析才能在其上查找属性:
if (o.name === "geo") {
const nestedObj = JSON.parse(o.value);
console.log(nestedObj.ip);
}
您还可以考虑修复为该对象提供服务的任何对象,以使该值成为实际的对象-如果可能的话(虽然不可能,但这会使代码更有意义)。
您还可以考虑使用.find
而不是for
循环,以使代码更短,更美观:
const json = myarray.find(({ name }) => name === 'geo').value;
const nestedObj = JSON.parse(json);
(当然,如果geo
对象不存在,请首先测试undefined
)
答案 1 :(得分:1)
看起来value
为{geo}的对象的name
字段是JSON字符串。
由于value
是一个字符串,如果不先将字符串解析为对象,就无法直接访问ip
字段:
for (var i = 0; i < myarray.length; i++) {
var o = myarray[i];
if (o.name === "geo") {
/* "Convert" the JSON string in o.value to the corresponding object */
const valueObject = JSON.parse(o.value);
/* The ip field can now be accessed from the valueObject, parsed from
the JSON string in o.value */
console.log(valueObject.ip);
}
}