【问题标题】:How to iterate through array of objects and stringify如何遍历对象数组并进行字符串化
【发布时间】:2020-01-12 17:43:15
【问题描述】:

我一直在尝试提出解决方案。我已经测试了一些堆栈解决方案来迭代嵌套对象,但还没有让它正常工作。我的数据结构如下。

我一直在尝试首先迭代嵌套对象,这个堆栈似乎与我的相似。

Iterate through Nested JavaScript Objects

但是,当我在 for 循环中访问地理、值对象以获取其所有属性、ip、主机名、城市等时,我空手而归,未定义。这是我在下面尝试过的代码 sn-p。

我正在尝试获取整个对象中的所有键和值,并将它们字符串化为一个漂亮的参数字符串,以便在 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)

【问题讨论】:

  • I'm coming up empty handed with undefined 是否有错误信息,或者未定义什么值?你能成功进入if语句吗?
  • 也许给我们简化 myarray 示例以及您正在寻找的结果是什么
  • @CertainPerformance 我已经得到了 if 来评估 true,但是当 tri 到达嵌套值时,它在调试器中显示为未定义。
  • @GlenK - 对不起,我想我误解了你的要求。我正在寻找我发布的对象并遍历每个属性,甚至是嵌套属性,然后变成一个字符串,例如 firstname=john&lastname=smith&ip=111.111.111.11&hostname=rr.com 等

标签: javascript jquery arrays javascript-objects


【解决方案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 表示法中的 字符串。您必须先对其进行解析才能在其上查找属性:

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

【讨论】:

    【解决方案2】:

    “geo”的name 对象的value 字段似乎是一个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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-06
      • 1970-01-01
      相关资源
      最近更新 更多