【发布时间】:2021-05-15 02:12:49
【问题描述】:
我有一种情况,我需要从服务器 (SA) 获取信息,而该服务器又从另一台服务器 (SB) 获取信息。 SA 以 JSON 结果进行响应,但查看响应似乎 SB 使用来自 SOAP API 的 XML 进行响应,并且 SA 在将 XML 发送回之前将其转换为 JSON。
SA 的响应示例如下:
{
fieldA : "some string", // "hello stackoverflow"
fieldB : JSON object, // {"a" : "b" , "cd" : "ef" }
fieldC : JSON object with fields representing array indices // { "0": "interesting" , "1" : "not helpful" }
}
当我得到响应时,我不知道根中的“fieldA”、“fieldB”等会是什么,也不知道 JSON 字段的深度。
所以我做了一个如下的递归函数,它适用于我拥有的示例数据。有什么我在这里忽略的东西可以打破这个循环,还是有更优化的版本?
var prunedResponse = (function prune(obj){
let val = new Object();
for(let [k,v] of Object.entries(obj)){
if( k !== "attributes" ){
if( typeof v !== 'object' ) val[k] = v;
else if( !Object.keys(v).filter( _k => isNaN(_k*1) ).length ) val[k] = Object.values(v).map(_v => prune(_v));
else val[k] = prune(v);
}
}
return val;
})(responseData);
下面是想要的输出
{
fieldA : "some string",
fieldB : { "a" : "b" , "cd" : "ef" },
fieldC : [ "interesting" , "not helpful" ]
}
【问题讨论】:
-
您还没有描述
prune实际应该做什么。提供具体的输入/输出示例将使我们能够更有效地帮助您 -
@Thankyou .. 正如我在问题标题中所说,基本目标是遍历整个 JSON 对象,无论它嵌套有多深,如果有任何字段以数字为键,将该字段转换为数组,而不是其他所有内容。前任。将
{"y":{"x":{"0":"a","1":b"},"z":"alpha"}}转换为{"y":{x:["a","b"],"z":"alpha"}}。 [编辑:在问题中添加了所需的输出]
标签: javascript arrays json recursion