You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何过滤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();

关键修改说明

  1. 修正条目提取逻辑
    原filter函数存在循环重置数组、误处理id字段的问题,重构为extractEntries后,只提取数字键对应的子对象,确保结果都是有效的name+date条目。

  2. 替换硬编码日期筛选
    利用日期字符串YYYY-MM-DD的格式特性,用startsWith("2019-12")直接判断是否属于目标月份,无需硬编码具体日期;如果需要验证日期的有效性,可以改用注释里的Date对象判断方式(注意Date对象的月份是0-11,12月对应数值11)。

  3. 优化遍历方式
    用for...of遍历数组,比for...in更直观,避免遍历到数组原型链上的无关属性。

内容的提问来源于stack exchange,提问作者B Rane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 18:01:11