如何提取Fetch返回的对象数组为非对象型数组?或调整源JSON格式?
首先明确你的输入:经过fetch().json()处理后,你得到的是一个对象数组,每个元素是包含title和page属性的对象,示例如下:
const pagesArray = [ {title: "People Policies", page: "people.html"}, {title: "Client Policies", page: "client.html"} ];
根据你想要的「不含对象的简单数组(多组键值对)」需求,分两种常见场景给出方案:
1. 保留键和值的键值对数组
如果你希望每个对象的键与值以序列形式存放在子数组中(比如["title", "People Policies", "page", "people.html"]),可以结合map()和Object.entries()再做扁平化处理:
const keyValueArrays = pagesArray.map(obj => Object.entries(obj).flat()); // 最终结果: // [ // ["title", "People Policies", "page", "people.html"], // ["title", "Client Policies", "page", "client.html"] // ]
这里Object.entries(obj)会把单个对象转成[["title", "xxx"], ["page", "xxx"]]的嵌套数组,再用flat()拉平为一维,最后通过map()遍历整个数组处理每个对象。
2. 仅保留属性值的数组
如果你只需要每个对象的属性值组成子数组(比如["People Policies", "people.html"]),直接用map()结合Object.values()即可:
const valueArrays = pagesArray.map(obj => Object.values(obj)); // 最终结果: // [ // ["People Policies", "people.html"], // ["Client Policies", "client.html"] // ]
Object.values(obj)会直接提取对象的所有属性值并返回数组,完全适配这种场景。
关于格式化源文件的替代方案
如果你有权修改源JSON文件的结构,可以直接调整成最终需要的格式,这样fetch后无需额外处理:
- 若想要仅存值的数组,源文件可写成:
[ ["People Policies", "people.html"], ["Client Policies", "client.html"] ]
- 若需要保留键的语义但不想嵌套在
pages对象里,源文件可直接写成对象数组(也就是你现在json()处理后得到的数组):
[ {"title": "People Policies", "page": "people.html"}, {"title": "Client Policies", "page": "client.html"} ]
为什么你之前用Object.entries(obj)无效?
大概率是你直接对整个数组调用了Object.entries(),而非遍历数组中的每个对象。比如Object.entries(pagesArray)会返回数组索引与对应元素的键值对(比如[["0", {...}], ["1", {...}]]),这显然不是你想要的结果。正确的做法是用map()遍历数组,对每个对象单独使用Object.entries()或Object.values()。
内容的提问来源于stack exchange,提问作者Michael Cox

