javascript---比较对象之间的是否相同,Array的删除方法

本文探讨了JavaScript中数组操作的细节,重点介绍了splice和delete方法的区别,并提供了一种自定义的数组元素比较方法,适用于复杂数据类型如嵌套对象和数组的比较。通过示例代码展示了如何实现这一功能。
摘要由CSDN通过智能技术生成

比较对象之间的是否相同

今天在做项目的时候,遇到一个问题就是删除一个Array里面某个位置的数据,之后查询了一下网上的写法,基本就是使用一个Array自己带的一个方法,splice方法和delete方法,二者的区别,就是一个直接改变原先的数组长度,一个不改变,splice里面有两个参数,一个是下标,一个是长度,就是删除这个下标后面的几个数据,之后会改变原先的数据长度,之后delete主要是删除数据,但是不改变原先的数据长度,利用undefined来进行占位。我用的是splice这个方法,但是在获取下标的时候,在再用indexOf的时候,获取到的基本都是基本数据类型可以获取到位置,比如,string,number等,但是要是object的时候,就一直都是-1。所以就在网上找了一个方法,但是这个方法经过测试,只能判断基本类型,string,number,undefined,null,object,复杂的数据类型就判断不了了,比如在object里面在嵌套一个object,或者是Array,就不可以了,但是可以根据自己的需求,根据既定的object结构,进行添加算法和判断。

下面是demo和结果,里面添加了array的获取下角标以及其中的删除方法。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>text</title>
</head>
<body>
<script>

    //只能判断简单是数据类型和其中的结构
    var cmp = function( x, y ) {

        /*
            判断两个数据的基本类型,null,undefined,string,nummber,是不是这四个基本类型,
            要是这四个基本类型,利用===进行比较,直接可以判定,二者相同;
        */
        if ( x === y ) {
            return true;
        }

        /*
            分别判断,二者是不是objct的类型数据,如果二者有一个不是object,则二者不相同
        */
        if ( ! ( x instanceof Object ) || ! ( y instanceof Object ) ) {
            return false;
        }

        /*
            constructor 属性返回对创建此对象的数组函数的引用。
            如果二者的函数引用不相同,则判定,二者不相同,
        */
        if ( x.constructor !== y.constructor ) {
            return false;
        }

        /*
            对其进行迭代的数据处理
        */
        for ( var p in x ) {

            /*
                判断实体里面有没有这个属性
            */
            if ( x.hasOwnProperty( p ) ) {
                // 如果另一个实体里面没有这个属性,则直接返回不相同
                if ( ! y.hasOwnProperty( p ) ) {
                    return false;
                }

                // 比较两者的值,是不是相同,要是相同,则直接跳到下一个属性
                if ( x[ p ] === y[ p ] ) {
                    continue;
                }

                // 判断如果属性值不是object,则返回false
                if ( typeof( x[ p ] ) !== "object" ) {
                    return false;
                }
            }
        }

        for ( p in y ) {
            //遍历另一个实体里面的属性,判断x实体里面的属性有没有
            if ( y.hasOwnProperty( p ) && ! x.hasOwnProperty( p ) ) {
                return false;
            }
        }
        return true;
    };

    var array = new Array();
    array.push({"name":"小明"});
    array.push({"name":"小绿"});
    array.push({"name":"小白"});
    array.push({"name":"小黑"});
    array.push({"name":"小红"});

    //自己定义的获取到下标的方法
    Array.prototype.indexCmpOf = function(value){
        for(var i =0;i<this.length;i++){
            if(cmp(this[i],value)){
                return i;
            }
        }
        return -1;
    }

    Array.prototype.removeSplice = function(index,number){
        if(index>-1&&number<=this.length){
            this.splice(index,number);
        }

    }

    var a = {"name":"小红"};
    var b = {"name":"小红"};
    var c = {"name":"小红","id":123};
    console.log(cmp(a,b),cmp(a,c));

    console.log(array.indexCmpOf(a));
    console.log(array.indexCmpOf(c));
    console.log(array.removeSplice(array.indexCmpOf(a),1))
</script>
</body>
</html>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值