如何过滤JSON数组并实现非硬编码的日期匹配筛选
解决JSON数组的非硬编码日期筛选及名称筛选问题
首先修正原代码里的逻辑问题,再替换硬编码的日期筛选逻辑,实现需求中的两个筛选功能:
完整修改后的代码
// JSON 数据 var arr = [{ "id":"27", "0":{ "name":"Sam", "date":"2021-02-28" }, "1":{ "name":"Mark", "date":"2019-12-08" } },{ "id":"30", "0":{ "name":"Sam", "date":"2019-12-11" } }] // 修正后的条目提取函数:正确获取所有包含name和date的子项 function extractEntries() { var entries = []; for (let item of arr) { for (let key in item) { // 只处理数字键对应的子对象,跳过id字段 if (!isNaN(Number(key))) { entries.push(item[key]); } } } return entries; } function main(){ var filterDate = []; var filterName = []; var allEntries = extractEntries(); for(let entry of allEntries){ // 筛选name为"Sam"的条目 if(entry.name === "Sam"){ filterName.push(entry); } // 非硬编码筛选2019年12月的条目:利用日期字符串格式直接匹配 if(entry.date.startsWith("2019-12")){ filterDate.push(entry); } // 可选:更严谨的Date对象判断方式(适合需要验证日期有效性的场景) // const dateObj = new Date(entry.date); // if(dateObj.getFullYear() === 2019 && dateObj.getMonth() === 11){ // filterDate.push(entry); // } } console.log("name为SAM的条目:", filterName); console.log("日期为2019年12月的条目:", filterDate); } main();
关键修改说明
修正条目提取逻辑
原filter函数存在循环重置数组、误处理id字段的问题,重构为extractEntries后,只提取数字键对应的子对象,确保结果都是有效的name+date条目。替换硬编码日期筛选
利用日期字符串YYYY-MM-DD的格式特性,用startsWith("2019-12")直接判断是否属于目标月份,无需硬编码具体日期;如果需要验证日期的有效性,可以改用注释里的Date对象判断方式(注意Date对象的月份是0-11,12月对应数值11)。优化遍历方式
用for...of遍历数组,比for...in更直观,避免遍历到数组原型链上的无关属性。
内容的提问来源于stack exchange,提问作者B Rane
相关产品推荐
相关产品推荐

