【发布时间】:2020-09-07 14:12:31
【问题描述】:
我希望实现的是使用递归或其他方法根据 json 输入动态创建特定的输出。下面只是一些json的例子和我希望完成的格式。
"id": "0001",
"type": "donut",
"name": "Cake",
"image": [
{
"url": "images/0001.jpg",
"width": 200,
"height": 200
},
{
"url": "images/0002.jpg",
"width": 300,
"height": 300
}
],
"thumbnail": {
"url": "images/thumbnails/0001.jpg",
"width": 32,
"height": 32
}
}
使用以下格式构建一个键数组。
["id","type","name","image[0].url","image[0].width","image[0].height","image[1].url","image[1].width","image[1].height","thumbnail.url","thumbnail.width","thumbnail.height"]
在构建数组之后,我想遍历数组并构建一个如下所示的字符串。
[ "id" ; $id ; JSONString ];[ "type" ; $type ; JSONString ];[ "name" ; $name ; JSONString ];[ "image[0].url" ; $image.url[0] ; JSONString ];[ "image[0].width" ; $image.width[0] ; JSONString ];[ "image[0].height" ; $image.height[0] ; JSONString ];[ "image[1].url" ; $image.url[1] ; JSONString ]...
到目前为止,我已经能够在相当简单的 JSON 上完成这项工作,但在我尝试使用更复杂的结构时却没有得到任何结果。
JS 代码:已编辑
var json = '{"id":"0001","type":"donut","name":"Cake","image":[{"url":"images/0001.jpg","width":200,"height":200},{"url":"images/0002.jpg","width":300,"height":300}],"thumbnail":{"url":"images/thumbnails/0001.jpg","width":32,"height":32}}';
var obj = JSON.parse(json);
// Recursion through the json
function getKeys(object) {
return Object
.entries(object)
.reduce((r, [k, v]) =>
r.concat(v && typeof v === 'object'
? getKeys(v).map(sub => [k].concat(sub))
: k
),
[]
);
}
function buildFM(object) {
var objLength = object.length;
var i = 1;
var str = '';
for (x of object) {
var nodes = x.split(/\.(?=[^\.]+$)/);
if (i == objLength) {
str += '[ "' + x + '" ; $' + nodes[nodes.length - 1] + ' ; JSONString ]';
} else {
str += '[ "' + x + '" ; $' + nodes[nodes.length - 1] + ' ; JSONString ] ; ';
}
i++;
}
return str;
}
// Result from Recursion
result = getKeys(obj);
console.log(result);
// Setup Map of JSON for creating FM function
var fmMap;
fmMap = result.map(a => a.join('.'));
console.log(fmMap);
// Build FM Elements
var fmFX = '';
var fmFX = buildFM(fmMap);
console.log(fmFX);
使用下面的 JSON 这个方法可以正常工作。
var json = '{"fieldData":{"City":"New York","FirstName":"John","ID":"001","LastName":"Doe","State":"NY","Zip":"10005"}}';
在我尝试过的更复杂的示例中,出现以下错误。
错误:
Uncaught TypeError: a.join is not a function
at jsonRecursion.html:216
at Array.map (<anonymous>)
at jsonParsing.html:216
如何处理更复杂的 json 以获取示例中的键数组?
【问题讨论】:
-
你能举个更复杂的json失败的例子吗?
-
.joinis not a function 表示它不是数组,这意味着您需要检查哪些映射值不是数组 -
你能不能也把你的
JS Code放到一个sn-p 中?当我尝试将您的代码粘贴到 sn-p 中时,出现“无法获取未定义的长度”错误。您的示例可能需要修复 -
A. L. 编辑JS并放入sn-p。
-
@jimrice 我对
pathToString进行了编辑,我想你会喜欢的
标签: javascript arrays json recursion