javascript - JSON.stringify 不转换数组

标签 javascript arrays json stringify

我知道我以错误的方式解决了这个问题,老实说,这可能是因为我没有正确处理递归,但如果是这样,我不确定我哪里出错了。这是 example 的链接.

这是 JavaScript -

function propertyTest(currentObject, key) {
    for (var property in currentObject) {
        if (typeof currentObject[property] === "object") {
            propertyTest(currentObject[property], property);
        } else {
            // this is only to test the output
            $('#method1').append((property == 'value' && key ? key : property) + ' -- ' + currentObject[property] + '<br />');
            propertyKey = (property == 'value' && key ? key : property);
            propertyValue = currentObject[property];
            var arrayJSON = [];
            arrayJSON.push(propertyKey);
            arrayJSON.push(propertyValue);
        }
    }
    var JSONString = JSON.stringify(arrayJSON);
    console.log(JSONString);
    return JSONString;
}

这是原始的 JSON -

var oarsObject = [{
    "coordinateReferenceSystem": "26782,15851",
    "positionReferenceType": "geogWgs84",
    "geogWgs84": {
        "latitude": {
            "value": 0.50507158458214041
        },
        "longitude": {
            "value": -1.604064725846865
        },
        "height": {
            "value": 0.0
        }
    }
}, {
    "coordinateReferenceSystem": "26782,15851",
    "positionReferenceType": "geogWgs84",
    "geogWgs84": {
        "latitude": {
            "value": 0.50509265195620767
        },
        "longitude": {
            "value": -1.5961047836759397
        },
        "height": {
            "value": 0.0
        }
    }
}, {
    "coordinateReferenceSystem": "26782,15851",
    "positionReferenceType": "geogWgs84",
    "geogWgs84": {
        "latitude": {
            "value": 0.4963464715653228
        },
        "longitude": {
            "value": -1.5960947041991222
        },
        "height": {
            "value": 0.0
        }
    }
}, {
    "coordinateReferenceSystem": "26782,15851",
    "positionReferenceType": "geogWgs84",
    "geogWgs84": {
        "latitude": {
            "value": 0.49632551101280209
        },
        "longitude": {
            "value": -1.604015267530267
        },
        "height": {
            "value": 0.0
        }
    }
}]

JSON 如您所料发送到函数 -

propertyTest(oarsObject);

这是它偏离轨道的证据,来自控制台的片段 -

["latitude",0.5050715845821404]
["longitude",-1.604064725846865]
["height",0]
undefined
["positionReferenceType","geogWgs84"]
["latitude",0.5050926519562077]
["longitude",-1.5961047836759397]
["height",0]
undefined

请注意前两项最初是如何出现在日志中的,然后才出现在 positionReferenceType 之后。另请注意 undefined JSON 字符串。我确定这是因为我的递归错误。

我知道 JavaScript 数组需要数字键在阅读其他几篇文章后,但我很好奇。 JSON.stringify() 似乎适用于其中一些而不适用于其他。此外,结果不一致,在第一轮之后 positionReferenceType 确实得到了字符串化,尽管顺序显然是错误的(同样,我确信这是因为我的递归工作已关闭)。

此用例有两个方面。首先,我们要删除由我们此时无法修改的系统部分生成的原始 JSON 中不必要的“值”键。其次,系统的其他部分使用我们希望从这样的函数输出的离散的较小 JSON 位。输出应该是小的、单独的 JSON 字符串(类似于 HTML 输出中显示的内容)。 输出应该是单个 JSON 字符串,由单独的键/值对组成,如下例所示。

[
    {
        "coordinateReferenceSystem": "26782,15851"
    },
    {
        "positionReferenceType": "geogWgs84"
    },
    {
        "latitude": 0.5050715845821404
    },
    {
        "longitude": -1.604064725846865
    },
    {
        "height": 0
    }
]

我什至还没有接近组装整个 JSON 字符串的地步,因为我只是试图正确地取出对。

我确定我在这里忽略了一些东西。我应该创建一个对象而不是数组来使所有内容都进行字符串化吗?还是我的递归中有什么东西让我绊倒了,而不是我认为是我提到的明显问题?

最佳答案

通常,有两种方法可以重复并得到一个扁平化的数组作为结果。

  • 首先是将结果数组作为参数传递,每次递归都会添加到它。
  • 其次是每次调用返回一个数组,上层将其添加到自己的结果中。

无论哪种方式,您都需要先测试 Array 主题,然后再检查 Object 主题,因为 Array 是 Object,通常您会想为它们做不同的事情。

此外,通常您会在递归之外处理结果(例如,转换为 JSON 然后记录),以保持递归简短。

这是一个使用第一种方法的实现,它在顶层包含 JSON 转换。 我已尽可能重复使用您的变量名。

function propertyTest( currentObject, array, key ) {
   var result = array || [], o;

   if ( Array.isArray( currentObject ) ) {
      currentObject.forEach( function ( e ) { propertyTest( e, result ); } );

   } else if ( typeof ( currentObject ) === 'object' ) {

      if ( 'value' in currentObject && Object.keys( currentObject ).length === 1 ) {
         propertyTest( currentObject.value, result, key );

      } else {

         for ( var property in currentObject ) {
            propertyTest( currentObject[ property ], result, property );
         }

      }

   } else {
      result.push( o = {} );
      o[ key ] = currentObject;
   }

   return array === undefined ? JSON.stringify( result ) : result;
}

var oarsObject = [{
    "coordinateReferenceSystem": "26782,15851",
    "positionReferenceType": "geogWgs84",
    "geogWgs84": {
        "latitude": {
            "value": 0.50507158458214041
        },
        "longitude": {
            "value": -1.604064725846865
        },
        "height": {
            "value": 0.0
        }
    }
}, {
    "coordinateReferenceSystem": "26782,15851",
    "positionReferenceType": "geogWgs84",
    "geogWgs84": {
        "latitude": {
            "value": 0.50509265195620767
        },
        "longitude": {
            "value": -1.5961047836759397
        },
        "height": {
            "value": 0.0
        }
    }
}, {
    "coordinateReferenceSystem": "26782,15851",
    "positionReferenceType": "geogWgs84",
    "geogWgs84": {
        "latitude": {
            "value": 0.4963464715653228
        },
        "longitude": {
            "value": -1.5960947041991222
        },
        "height": {
            "value": 0.0
        }
    }
}, {
    "coordinateReferenceSystem": "26782,15851",
    "positionReferenceType": "geogWgs84",
    "geogWgs84": {
        "latitude": {
            "value": 0.49632551101280209
        },
        "longitude": {
            "value": -1.604015267530267
        },
        "height": {
            "value": 0.0
        }
    }
}];

alert( propertyTest( oarsObject ) );

关于javascript - JSON.stringify 不转换数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28484995/

相关文章:

Javascript 全局数组未定义

java - 更改 JTextArea 中的文本

android - 将字符串转换为 json 对象

javascript - 脚本可以在电脑上运行,但不能在移动设备上运行

尝试隐藏表格行时出现 JavaScript 错误

javascript - ajax 加载到 jqPlot 中

php - MySQLi 附加更多/更深的结果

php - 如何将新值插入 mysql json 数组?

javascript - 如何允许在 Atom 中双击选择带有 - 的字符串?

javascript - 取消回调函数的返回值