
本文介绍如何为包含多风场的地区设计高效、可扩展的 json 数据结构,并提供 javascript 示例代码,帮助初学者轻松实现按地区查询多个风场信息。
在构建基于邮政编码查询本地风电场的工具时,数据往往不是“一地一风场”,而是“一地多风场”(如 Derbyshire Dales 包含两个社区能源项目)。此时,传统的单值键值对结构(如 {"Copeland": {"hasWindfarm": "Yes"}})不再适用。我们需要一种既能保留地区名称作为主键、又能灵活承载多个风场及其属性的 JSON 组织方式。
✅ 推荐方案:地区为键,风场数组为值(简洁通用)
最清晰、易读且便于前端遍历的结构是将每个地区映射为一个对象,其 windfarms 字段为风场对象数组。每个风场对象可包含名称、容量、建成年份等任意扩展字段:
{
"Copeland": {
"windfarms": [
{ "name": "Sustainable Keswick", "capacityMW": 12.5, "status": "operational" }
]
},
"Crewe and Nantwich": {
"windfarms": [
{ "name": "Nantwich Hydro", "capacityMW": 8.2, "status": "operational" }
]
},
"Derbyshire Dales": {
"windfarms": [
{ "name": "Matlock Community Energy Project", "capacityMW": 4.7, "status": "planned" },
{ "name": "Derby Dales Community Energy", "capacityMW": 6.0, "status": "under-construction" }
]
}
}✅ 优势:
- 语义明确(windfarms 是自然复数概念);
- 支持统一遍历(无需动态键名);
- 易于添加新风场(.push() 即可);
- 兼容所有现代 API 工具与地图平台(如 Mapbox、Leaflet 的 GeoJSON 关联逻辑)。
? 如何在 JavaScript 中安全访问与使用
假设你已通过 fetch() 获取 JSON 并解析为 data 对象:
// 示例:查询用户输入的地区(如 "Derbyshire Dales")
const location = "Derbyshire Dales";
const region = data[location];
if (region && Array.isArray(region.windfarms) && region.windfarms.length > 0) {
console.log(`? ${location} 有 ${region.windfarms.length} 个风场:`);
region.windfarms.forEach((wf, index) => {
console.log(` ${index + 1}. ${wf.name}(${wf.capacityMW} MW,${wf.status})`);
});
} else {
console.log(`❌ ${location} 暂无已登记风场。`);
}⚠️ 关键注意事项:
- 始终检查 data[location] 是否存在,避免 Cannot read property 'windfarms' of undefined 错误;
- 使用 Array.isArray() 验证 windfarms 字段类型,防止数据格式异常;
- 地区名称若含空格或特殊字符(如 "Crewe and Nantwich"),确保前端传参时未被意外截断或转义;
- 若需支持模糊匹配(如用户输错拼写),建议额外维护一个 aliases 映射表或引入轻量级模糊搜索库(如 Fuse.js)。
? 进阶建议:面向未来的结构优化
当数据规模扩大(如数百地区、上千风场)时,可进一步优化:
- 扁平化 ID 引用:将风场独立为全局数组,地区仅存储 ID 列表,减少重复数据;
- 增加地理坐标:在每个风场对象中加入 lat/lng,便于地图可视化;
- 版本化与缓存:为 JSON 添加 "version": "2024.1" 字段,并设置 HTTP 缓存头,提升加载性能。
无论当前项目规模大小,采用“地区 → 风场数组”的结构都能兼顾可读性、可维护性与扩展性——这是 JSON 数据建模中「单一职责」与「自然语义」原则的典型实践。










