JSON.stringify 不转换数组
JSON.stringify does not convert arrays
我知道我做错了,老实说,这可能是因为我没有正确处理递归,但如果是这样,我不确定哪里出了问题。这是 link 到 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);
这是 rails 的证据,来自控制台的一个片段 -
["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 中不必要的 'value' 密钥,该密钥由我们此时无法修改的系统部分生成。其次,系统的其他部分消耗了我们希望从这样的函数输出的离散的较小 JSON 位。输出应该是小的、单独的 JSON 字符串(类似于 HTML 输出中显示的内容)。 输出应该是单个 JSON 字符串,由单独的键/值对组成,如下例所示。
[
{
"coordinateReferenceSystem": "26782,15851"
},
{
"positionReferenceType": "geogWgs84"
},
{
"latitude": 0.5050715845821404
},
{
"longitude": -1.604064725846865
},
{
"height": 0
}
]
我什至还没有接近组装整个 JSON 字符串的程度,因为我只是试图正确地找出对。
我确定我在这里忽略了一些东西。我应该创建一个对象而不是数组来使所有内容都进行字符串化吗?还是我的递归中有什么东西让我绊倒了,而不是我认为是我提到的明显问题?
通常有两种方法可以重复并得到一个扁平的数组作为结果。
- 首先是将结果数组作为参数传递,每次递归都会对其进行添加。
- 其次是每次调用 returns 一个数组,上层将其添加到自己的结果中。
无论哪种方式,你都需要先测试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 ) );
如 Sheepy 所述,您可能希望将结果数组的范围限制在递归函数之外。
当它是数组值时使用forEach
,当它是对象的对象时使用for
。这样你只处理一个对象的推送而不必维护数组。
Example jsFiddle
var arrayJSON = [];
function propertyTest(currentObject, key) {
if (Array.isArray(currentObject)) {
currentObject.forEach(propertyTest);
} else {
for (var returnKey in currentObject) {
if (typeof currentObject[returnKey] === 'object') {
propertyTest(currentObject[returnKey], returnKey);
} else {
var newKey = (returnKey === 'value' && key) ? key : returnKey;
var newObj = {};
newObj[newKey] = currentObject[returnKey];
arrayJSON.push(newObj);
$('#method1').append( newKey + ' -- ' + currentObject[returnKey] + '<br />');
}
}
}
}
propertyTest(oarsObject);
console.log(JSON.stringify(arrayJSON););
我知道我做错了,老实说,这可能是因为我没有正确处理递归,但如果是这样,我不确定哪里出了问题。这是 link 到 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);
这是 rails 的证据,来自控制台的一个片段 -
["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 中不必要的 'value' 密钥,该密钥由我们此时无法修改的系统部分生成。其次,系统的其他部分消耗了我们希望从这样的函数输出的离散的较小 JSON 位。输出应该是小的、单独的 JSON 字符串(类似于 HTML 输出中显示的内容)。 输出应该是单个 JSON 字符串,由单独的键/值对组成,如下例所示。
[
{
"coordinateReferenceSystem": "26782,15851"
},
{
"positionReferenceType": "geogWgs84"
},
{
"latitude": 0.5050715845821404
},
{
"longitude": -1.604064725846865
},
{
"height": 0
}
]
我什至还没有接近组装整个 JSON 字符串的程度,因为我只是试图正确地找出对。
我确定我在这里忽略了一些东西。我应该创建一个对象而不是数组来使所有内容都进行字符串化吗?还是我的递归中有什么东西让我绊倒了,而不是我认为是我提到的明显问题?
通常有两种方法可以重复并得到一个扁平的数组作为结果。
- 首先是将结果数组作为参数传递,每次递归都会对其进行添加。
- 其次是每次调用 returns 一个数组,上层将其添加到自己的结果中。
无论哪种方式,你都需要先测试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 ) );
如 Sheepy 所述,您可能希望将结果数组的范围限制在递归函数之外。
当它是数组值时使用forEach
,当它是对象的对象时使用for
。这样你只处理一个对象的推送而不必维护数组。
Example jsFiddle
var arrayJSON = [];
function propertyTest(currentObject, key) {
if (Array.isArray(currentObject)) {
currentObject.forEach(propertyTest);
} else {
for (var returnKey in currentObject) {
if (typeof currentObject[returnKey] === 'object') {
propertyTest(currentObject[returnKey], returnKey);
} else {
var newKey = (returnKey === 'value' && key) ? key : returnKey;
var newObj = {};
newObj[newKey] = currentObject[returnKey];
arrayJSON.push(newObj);
$('#method1').append( newKey + ' -- ' + currentObject[returnKey] + '<br />');
}
}
}
}
propertyTest(oarsObject);
console.log(JSON.stringify(arrayJSON););