为JSON数组中子文档添加对应位置字段ballNo的需求
给JSON中每个deliveries子项添加ballNo字段
我现在有这样的JSON结构:
初始结构
{ "overs": [ { "over": 1, "deliveries": [{"runs":1},{"runs":0},{"runs":2},{"runs":4},{"runs":0},{"runs":0}] }, { "over": 2, "deliveries": [{"runs":3},{"runs":6},{"runs":2},{"runs":0},{"runs":0},{"runs":0}] } ] }
需要给deliveries数组的每个子对象添加ballNo字段,值为该子对象在数组中的位置(从1开始计数),最终得到:
目标结构
{ "overs": [ { "over": 1, "deliveries": [ {"ballNo":1, "runs":1}, {"ballNo":2, "runs":0}, {"ballNo":3, "runs":2}, {"ballNo":4, "runs":4}, {"ballNo":5, "runs":0}, {"ballNo":6, "runs":0} ] }, { "over": 2, "deliveries": [ {"ballNo":1, "runs":3}, {"ballNo":2, "runs":6}, {"ballNo":3, "runs":2}, {"ballNo":4, "runs":0}, {"ballNo":5, "runs":0}, {"ballNo":6, "runs":0} ] } ] }
JavaScript 实现
遍历overs数组,对每个over的deliveries数组使用map方法,结合索引(索引从0开始,需加1)生成新对象:
const data = { overs: [ {over:1, deliveries: [{runs:1},{runs:0},{runs:2},{runs:4},{runs:0},{runs:0}]}, {over:2, deliveries: [{runs:3},{runs:6},{runs:2},{runs:0},{runs:0},{runs:0}]} ] }; const result = { overs: data.overs.map(over => ({ ...over, deliveries: over.deliveries.map((delivery, index) => ({ ballNo: index + 1, ...delivery })) })) }; console.log(result);
Python 实现
遍历每个over,再遍历deliveries列表,用enumerate指定起始索引为1,给每个字典添加ballNo:
data = { "overs": [ {"over": 1, "deliveries": [{"runs":1},{"runs":0},{"runs":2},{"runs":4},{"runs":0},{"runs":0}]}, {"over": 2, "deliveries": [{"runs":3},{"runs":6},{"runs":2},{"runs":0},{"runs":0},{"runs":0}]} ] } for over in data["overs"]: for idx, delivery in enumerate(over["deliveries"], start=1): delivery["ballNo"] = idx print(data)
Java 实现
使用Stream API遍历处理,给每个delivery对象添加ballNo字段:
import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class AddBallNo { public static void main(String[] args) { List<Map<String, Object>> overs = new ArrayList<>(); // 初始化测试数据 List<Map<String, Object>> deliveries1 = new ArrayList<>(); deliveries1.add(Map.of("runs", 1)); deliveries1.add(Map.of("runs", 0)); deliveries1.add(Map.of("runs", 2)); deliveries1.add(Map.of("runs", 4)); deliveries1.add(Map.of("runs", 0)); deliveries1.add(Map.of("runs", 0)); overs.add(Map.of("over", 1, "deliveries", deliveries1)); List<Map<String, Object>> deliveries2 = new ArrayList<>(); deliveries2.add(Map.of("runs", 3)); deliveries2.add(Map.of("runs", 6)); deliveries2.add(Map.of("runs", 2)); deliveries2.add(Map.of("runs", 0)); deliveries2.add(Map.of("runs", 0)); deliveries2.add(Map.of("runs", 0)); overs.add(Map.of("over", 2, "deliveries", deliveries2)); // 处理添加ballNo List<Map<String, Object>> processedOvers = overs.stream() .map(over -> { int overNum = (int) over.get("over"); List<Map<String, Object>> deliveries = (List<Map<String, Object>>) over.get("deliveries"); List<Map<String, Object>> processedDeliveries = new ArrayList<>(); for (int i = 0; i < deliveries.size(); i++) { Map<String, Object> newDelivery = deliveries.get(i).entrySet().stream() .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); newDelivery.put("ballNo", i + 1); processedDeliveries.add(newDelivery); } return Map.of("over", overNum, "deliveries", processedDeliveries); }) .collect(Collectors.toList()); System.out.println(processedOvers); } }
内容的提问来源于stack exchange,提问作者gnosticmind
相关产品推荐
相关产品推荐

