JavaScript设计模式(二十三)【迭代模式】

本文介绍了自定义的数组和对象迭代器函数,包括数组迭代eachArray和对象迭代eachObject,用于遍历数组和对象并执行回调函数。同时,文章还展示了如何通过迭代器进行同步变量的获取和设置,提供了具体代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// 数组迭代
var eachArray = function(arr, fn) {
    var i = 0,
        len = arr.length;
    // 遍历数组
    for (; i < len; i++) {
        // 依次执行回调函数,注意回调函数中传入的参数第一个为索引,第二个为改索引对应的值
        if (fn.call(arr[i], i, arr[i]) === false) {
            break;
        }
    }
};

// 对象迭代器
var eachObject = function(obj, fn) {
    // 遍历对象中的每一个属性
    for (var i in obj) {
        // 依次执行回调函数,注意回调函数中传入的参数第一个为属性,第二个为该属性对应的值
        if (fn.call(obj[i], i, obj[i]) === false) {
            break;
        }
    }
};

var arr = [0, 1, 2, 3, 4, 5];

eachArray(arr,
    function(arr, i, item) {

        console.log(arr + '---' + i + '---' + item);

    });

// 同步变量
var A = {
    // 所有用户共有
    common: {},
    // 客户端数据
    client: {
        user: {
            username: '雨夜清河',
            uid: '123'
        }
    },
    // 服务器端数据
    server: {}
};

// 同步变量迭代取值器
var AGetter = function(key) {
    // 如果不存在A则返回未定义
    if (!A)
        return undefined;
    var result = A; //获取同步变量A 对象
    key = key.split('.'); // 解析属性层次序列
    //迭代同步变量A对象属性
    for (var i = 0, len = key.length; i < len; i++) {
        // 如果第i层属性存在对应的值则迭代该属性值
        if (result[key[i]] != undefined) {
            result = result[key[i]];
            // 如果不存在则返回未定义
        } else {
            return undefined;
        }
    }
    // 返回获取的结果
    return result;
}

// 同步变量迭代赋值器

ASetter = function(key, val) {
    // 如果不存在A则返回未定义
    if (!A) {
        return false;
    }
    var result = A; // 获取同步变量A对象
    key = key.split('.'); // 解析属性层次序列
    // 迭代同步变量A对象属性
    for (var i = 0, len = key.length; i < len - 1; i++) {
        // 如果第i层属性对应的值不存在,则定义为对象
        if (result[key[i]] === undefined) {
            result[key[i]] = {};
        }
        // 如果第i层对应的值不是对象的一个实例,则抛出错误
        if (!(result[key[i]] instanceof Object)) {
            throw new Error('A.' + key.splice(0, i + 1).join('.' + 'is not object'));
            return false;
        }
        // 迭代该层属性值
        result = result[key[i]];
    }
    // 返回设置成功的属性值
    return result[key[i]] = val;
}

console.log(AGetter('client.user.username'));
console.log(ASetter('client.user.sex', 'girl'))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值