一些遍历对象属性的常用函数

话不多说,直接上代码!

一、对象的复制

把对象 a 中的可枚举属性复制到 b 中,如果有同名属性,就将其覆盖,不处理getter和setter以及复制属性。可能有人想到直接用 = 号进行赋值,如果直接采用 b = a 的方式进行复制,会导致修改 b 的同时 a 也会改变,这里涉及到对象数据类型(也有人称之为引用数据类型或复杂数据类型)的浅拷贝问题,所以很容易产生BUG。以下代码可解决此问题:

function extend(a, b) {
    for (let i in a) {
        b[i] = a[i];
    }
    return b;
}

注意,以上代码只可复制对象内的键值对,不能复制对象的特性(可写性、可枚举性、可配置性)和存取属性(getter,setter)。

在ES6中,对象新增了合并方法Object.assign(obj1, obj2, obj3......), 可以利用这个方法, 达到相同的效果。例如:b = Object.assign({}, a)。

 

二、对象的合并,且不影响主对象

还是用对象 a 、b 举例子,将对象 b 合并到 a 中,如果有同名属性, a 不受影响。此函数同样不处理getter和setter以及复制属性。

function merge(a, b) {
    for (let i in b) {
        if (a.hasOnwProperty[i]) continue;    // 判断 a 中是否有 i 属性
        a[i] = b[i];
    }
    return a;
}

之前提到过object.hasOnwProperty()可以判断属性是否存在。

 

三、两对象属性去重

如果 a 中的属性在 b 中存在同名属性,则从 a 中删除这个属性

function subtract(a, b) {
    for (let i in b) {
        delete a[i];    
    }
    return a;
}

值得注意的是,如果 a 中没有某个 b 的属性, 删除是不会报错的。

 

四、得到两个对象中共有的属性

返回一个新对象,这个对象包含了 a 和 b 共有的属性。且 b 中的属性值被忽略。

function intersection(a, b) {
    retrun restrict(extend({}, a), b);    // 这里直接引用上面的方法进行使用
}

以上几个函数的思路和方法都很简单,类似的需求,只要多动脑,都可以想出来的!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值