我有格式的JSON数据
[{
"Heading1": [{
"questionID": "q1",
"questionTitle": "Question 1",
"question": "This is question1",
"status": 0,
"files": [],
"uploadType": "none"
}, {
"questionID": "q2",
"questionTitle": "Question 2",
"question": "This is question2",
"status": 0,
"files": [],
"uploadType": "none"
}]
}, {
"Heading2": [{
"questionID": "q3",
"questionTitle": "Question 11",
"question": "This is a question11",
"status": 0,
"files": [],
"uploadType": "none"
}]
}, {
"Heading3": [{
"questionID": "q4",
"questionTitle": "Question 1",
"question": "This is a question",
"status": 0,
"files": [],
"uploadType": "none"
}]
}]
我试图以[{"Title":"Heading1"},{"Title":"Heading2"},{"Title":"Heading3"}]
这样的格式获得所有标题
我该怎么办呢?
首先,如果你真的有JSON(例如,你的起始点是一个字符串,例如来自ajax响应),你可以通过JSON.parse
解析它以获得一个对象数组。然后循环数组并通过Object.keys(x)[0]
从每个顶级对象中获取唯一的键,并将其映射到您想要的表单中的对象数组:
const json = '[{"Heading1":[{"questionID":"q1","questionTitle":"Question 1","question":"This is question1","status":0,"files":[],"uploadType":"none"},{"questionID":"q2","questionTitle":"Question 2","question":"This is question2","status":0,"files":[],"uploadType":"none"}]},{"Heading2":[{"questionID":"q3","questionTitle":"Question 11","question":"This is a question11","status":0,"files":[],"uploadType":"none"}]},{"Heading3":[{"questionID":"q4","questionTitle":"Question 1","question":"This is a question","status":0,"files":[],"uploadType":"none"}]}]';
const parsed = JSON.parse(json);
const result = parsed.map(entry => {
return {Title: Object.keys(entry)[0]};
});
console.log(result);
map
回调可以是一个简洁的箭头函数,但我认为使用上面的详细形式会更清楚。简洁的形式是:
const result = parsed.map(entry => ({Title: Object.keys(entry)[0]}));
请注意,以这种方式使用Object.keys
只有在对象确实只有一个属性时才可靠,就像您的问题一样。如果它们有多个属性,那么属性在Object.keys
数组中列出的顺序没有定义(即使在ES2015 +中,属性确实有一个顺序 - Object.keys
不需要遵循该顺序[尽管它在每个现代引擎上都有)我已经测试了])。