JavaScript使用递归方法来判断多层数组中指定 key 的值是否重复

使用了3个AI工具来写这个方法,其中CodeGeeXC知道的结果比较离谱。
最后使用AIchatOS生成了一个基本可用的。

提问内容:

js有个数组,写一个判断指定的key的值是否重复的方法,函数带详细的注释。这里指定的key为“remarks”,层次可能有多层,使用父节点“then”包裹子级层次。函数有3个参数:数组、key,父节点名。

原来的回答是这样的:

function hasDuplicateRemarks(arr, key, parentKey) {
    const seen = new Set(); // 用于存储已见的 remarks 值

    function check(arr) {
        for (const item of arr) {
            if (item[key]) {
                // 检查当前节点的 remarks 是否重复
                if (seen.has(item[key])) {
                    return true; // 找到重复的 remarks
                }
                seen.add(item[key]); // 记录该 remarks

                // 如果存在父节点,递归检查其子节点
                if (item[parentKey] && Array.isArray(item[parentKey])) {
                    const hasChildDup = check(item[parentKey]);
                    if (hasChildDup) return true; // 如果子节点有重复,返回 true
                }
            }
        }
        return false; // 没有找到重复
    }

    return check(arr); // 开始检查传入的数组
}

// 使用示例
const arr = [
    { remarks: "顶层浮窗:看广告" },
    { remarks: "中间层:开宝箱" },
    { remarks: "任务中心" },
    { 
        remarks: "左上菜单:任务中心", 
        then: [{ remarks: "任务中心" }] 
    },
    { 
        remarks: "首页", 
        then: [{ 
            remarks: "菜单", 
            then: [{ remarks: "菜单" }] 
        }] 
    }
];

console.log(hasDuplicateRemarks(arr, 'remarks', 'then')); // 输出:true

实测结果有细微偏差。手工修改了一下,加了个result来控制判断的跳出。

/**
 * 检查指定键的值是否在嵌套的数组结构中重复
 * @param {Array} arr - 要检查的数组
 * @param {string} key - 要检查的键
 * @param {string} parentKey - 父节点键名(默认为 "then")
 * @returns {boolean} - 如果有重复的键值返回 true,否则返回 false
 * @author 飞云
 * @wechat imfeiyun
 * @link  http://www.feiyunjs.com
 */
function hasDuplicateRemarks(arr, key, parentKey) {
    const seen = new Set(); // 用于存储已见的 remarks 值

    let result = false;
    function check(arr) {
        for (let item of arr) {
            if (item[key]) {
                // 检查当前节点的 remarks 是否重复
                if (seen.has(item[key])) {
                    console.log('节点重复:', item[key])

                    result = true;
                    break; // 找到重复的 remarks
                }
                seen.add(item[key]); // 记录该 remarks

                // 如果存在父节点,递归检查其子节点
                if (item[parentKey] && Array.isArray(item[parentKey])) {
                    const hasChildDup = check(item[parentKey]);
                    if (hasChildDup) {
                        console.log('子节点重复:', item[key])

                        result = true;
                        break; // 在子节点找到重复的 remarks
                    }
                }
            }
        }
        return result; // 没有找到重复
    }

    return check(arr); // 开始检查传入的数组
}

// 使用示例
const arr = [
    { remarks: "顶层浮窗:看广告" },
    { remarks: "中间层:开宝箱" },
    {
        remarks: "左上菜单:任务中心",
        then: [{ remarks: "任务中心" }]
    },
    {
        remarks: "首页",
        then: [{
            remarks: "菜单",
            then: [{ remarks: "菜单" }]
        }]
    }
];

console.log(hasDuplicateRemarks(arr, 'remarks', 'then')); // 输出:true

这个函数会检查数组中的每个对象及其嵌套的 then 属性,判断是否存在相同的 remarks 值。

如果找到重复的值,函数将返回 true;否则返回 false。

1. 官方交流QQ群,添加多个不批。建议使用安卓手机或电脑申请。
飞云脚本圈: 586333520飞云脚本圈
Auto.js学习交流③群:286635606
Auto.js学习交流②群:712194666(满员)
IOS免越狱自动化测试群:691997586
2. 盗版,破解有损他人权益和违法作为,请各位会员支持正版。
3. 本站部分资源来源于用户上传和网络搜集,如有侵权请提供版权证明并联系站长删除。
4.如未特别申明,本站的技术性文章均为原创,未经授权,禁止转载/搬运等侵权行为。
5.全站所有付费服务均为虚拟商品,购买后自动发货。售出后概不接受任何理由的退、换。注册即为接受此条款。
6.如果站内内容侵犯了您的权益,请联系站长删除。
飞云脚本 » JavaScript使用递归方法来判断多层数组中指定 key 的值是否重复

企业级大数据智能营销管理系统

了解详情