如何筛选并解析数组中的对象?JSON数据处理求助
问题解决:筛选符合条件的配送时段对象
问题根源分析
- 无效JSON字符串:原始
time_slots中的每个字符串存在语法错误(多余的}},),导致JSON解析后结构异常,selected属性无法被正确识别。 - 键名不匹配:代码中使用
extensionAttributes,但原始JSON的键是extension_attributes(下划线命名),导致无法正确读取time_slots数据。 - 冗余筛选逻辑:将单个解析对象放入数组再执行
filter完全没必要,且因解析结构异常导致筛选条件失效。
解决方案步骤
1. 修复原始JSON格式
将time_slots中的每个字符串修正为有效JSON,去掉多余的}},并替换为,":
{ "methods": [ { "extension_attributes": { "time_slots": [ "{\"display_name\":\"Today\",\"date\":\"3\\\\/3\\\\/23\",\"internal_date\":\"2023-03-03\",\"disabled\":0,\"timezone\":\"Asia\\\\/Dubai\",\"shipping_identifier\":\"today\",\"selected\":1,\"disabled\":0}", "{\"display_name\":\"Tomorrow\",\"date\":\"3\\\\/3\\\\/23\",\"internal_date\":\"2023-02-02\",\"disabled\":0,\"timezone\":\"Asia\\\\/Dubai\",\"shipping_identifier\":\"today\",\"disabled\":0}" ] } } ] }
2. 修正并优化代码
// 假设filteredShippingMethods对应原始JSON的methods数组 const filteredShippingMethods = [ { "extension_attributes": { "time_slots": [ "{\"display_name\":\"Today\",\"date\":\"3\\\\/3\\\\/23\",\"internal_date\":\"2023-03-03\",\"disabled\":0,\"timezone\":\"Asia\\\\/Dubai\",\"shipping_identifier\":\"today\",\"selected\":1,\"disabled\":0}", "{\"display_name\":\"Tomorrow\",\"date\":\"3\\\\/3\\\\/23\",\"internal_date\":\"2023-02-02\",\"disabled\":0,\"timezone\":\"Asia\\\\/Dubai\",\"shipping_identifier\":\"today\",\"disabled\":0}" ] } } ]; const mapDeliveryDates = (deliveryDate) => { // 使用原始JSON的下划线键名 return deliveryDate?.extension_attributes?.time_slots?.reduce((result, timeSlot) => { try { const parsedSlot = JSON.parse(timeSlot); // 直接判断条件,符合则加入结果数组 if (parsedSlot?.selected === 1) { result.push(parsedSlot); } } catch (error) { console.error("解析时段字符串失败:", error, "内容:", timeSlot); } return result; }, []); }; // 扁平化嵌套数组,得到最终筛选结果 const selectedShippingMethods = filteredShippingMethods.flatMap(mapDeliveryDates); console.log("选中的配送方式:", selectedShippingMethods);
代码说明
- 键名匹配:改用
extension_attributes与原始JSON结构对齐,确保数据能被正确读取。 - JSON解析容错:加入
try-catch处理解析错误,避免因格式问题导致程序中断。 - 高效筛选:用
reduce直接收集符合条件的对象,替代冗余的map+filter组合;通过flatMap将嵌套的结果数组扁平化,得到简洁的最终结果。
内容的提问来源于stack exchange,提问作者H.Husain
相关产品推荐
相关产品推荐

