js-对象与数组的一些操作

数组的深拷贝

1、for 循环实现数组的深拷贝

var arr = [1,2,3,4,5]
var arr2 = copyArr(arr)
function copyArr(arr) {
    let res = []
    for (let i = 0; i < arr.length; i++) {
     res.push(arr[i])
    }
    return res
}

2、slice 方法实现数组的深拷贝:

将原数组中抽离部分出来形成一个新数组。我们只要设置为抽离全部,即可完成数组的深拷贝。

var arr = [1,2,3,4,5]
var arr2 = arr.slice(0)
arr[2] = 5
console.log(arr)
console.log(arr2)

3、concat 方法实现数组的深拷贝:

用于连接多个数组组成一个新的数组的方法。那么,我们只要连接它自己,即可完成数组的深拷贝。

var arr = [1,2,3,4,5]
var arr2 = arr.concat()
arr[2] = 5
console.log(arr)
console.log(arr2)

对象的深拷贝

1、万能的for循环实现对象的深拷贝

var obj = {
  name: 'FungLeo',
  sex: 'man',
  old: '18'
}
var obj2 = copyObj(obj)
function copyObj(obj) {
  let res = {}
  for (var key in obj) {
    res[key] = obj[key]
  }
  return res
}

2、转换成json再转换成对象实现对象的深拷贝

上面的代码实在是比较长,所以,用一个更暴力的方法吧!代码如下:

var obj = {
  name: 'FungLeo',
  sex: 'man',
  old: '18'
}
var obj2 = JSON.parse(JSON.stringify(obj))

参考:javascript 数组以及对象的深拷贝(复制数组或复制对象)的方法

其他:

常用数组的操作

/*某元素是否在数组中*/
function contains(arr, obj) {
    var i = arr.length;
    while (i--) {
        if (arr[i] === obj) {
            return true;
        }
    }
    return false;
}



/*删除数组中指定元素*/
function removeByValue(arr, val) {
    for (var i = 0; i < arr.length; i++) {
        if (arr[i] == val) {
            arr.splice(i, 1);
            break;
        }
    }
    return arr;
}



/*判断是否是数组*/
function isArray(o) {
    return Object.prototype.toString.call(o) == '[object Array]';
}

/*数组的复制,且不影响原数组:concat方法
如果直接用等号,会影响原数组的数据
*/
    var a3 = [1];
    var b3 = a3.concat();
    b3[0]++;
    console.log("a3===" + a3[0]);
    //"1"  b3的修改对a3没效



关于对象的示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--
    /*------------------------数组、对象等按值传递,是指变量地址的值。
     数组、对象等的按值传递与数字、字符串还是有所不同的。
     数字、字符串是把值直接复制进去了,而数组、对象是把变量地址复制进去的。
     ------------------------------*/

-->
<script>

    var aArr = [];
    var bArr = [];
    console.log("aArr=bArr============" + (aArr == bArr));//false

    var aObj = {};
    var bObj = {};
    console.log("bObj=aObj============" + (bObj == aObj));//false

    /*------------------------------------------------------------*/
    //方法内部不影响外部变量
    var a = 10;
    var b = 20;
    function toChange(a, b) {//a,b交换数值
        var c = a;
        a = b;
        b = c;
        console.log("a==内部==========" + a);   //"20"
        console.log("b===内部=========" + b);   //"10"
    }
    toChange(a, b);

    console.log("a=外部==" + a);   //"10"
    console.log("b=外部==" + b);   //"20"

    /*---------------------------------------------------------------*/
    var v1 = [];
    var v2 = {};
    var v3 = {};
    function foo(v1, v2, v3) {//重新给地址赋值,不影响原有元素
        //方法内部为局部变量,不影响外部变量。
        v1 = [1];
        v2 = [2];
        v3 = {a: 3};
        console.log("内部v1==" + JSON.stringify(v1));//        内部v1==[1]
        console.log("内部v2==" + JSON.stringify(v2));//        内部v2==[2]
        console.log("内部v3==" + JSON.stringify(v3));//        内部v3=={"a":3}
    }

    foo(v1, v2, v3);

    console.log("外部v1==" + JSON.stringify(v1));//    外部v1==[]
    console.log("外部v2==" + JSON.stringify(v2));//    外部v2=={}
    console.log("外部v3==" + JSON.stringify(v3));//    外部v3=={}

    /*-----------------------------------------------------------------------------------*/
    /*--------------------直接等于对象,会影响原对象*/
    var obj1 = {
        "sortDirection": 1,
        "pageNo": 0,
        "pageSize": 10
    };
    var obj2 = obj1;
    obj2.name = "hhaa";
    console.log("=obj1后======" + JSON.stringify(obj1));

    /*-------------------将对象的值赋给新对象,不会影响原对象*/
    var obj1 = {
        "sortDirection": 1,
        "pageNo": 0,
        "pageSize": 10
    };
    var obj3 = copyObj(obj1);
    obj3.age = 100;
    console.log("copyObj(obj1)后======" + JSON.stringify(obj1));



    //拷贝对象的函数,不影响原对象
    function copyObj(obj) {
        var res = {};
        for (var key in obj) {
            res[key] = obj[key];
        }
        return res
    }

    //排序的函数
    function objKeySort(obj) {
        var newkey = Object.keys(obj).sort();
        //先用Object内置类的keys方法获取要排序对象的属性名,再利用Array原型上的sort方法对获取的属性名进行排序,newkey是一个数组
        var newObj = {};//创建一个新的对象,用于存放排好序的键值对
        for (var i = 0; i < newkey.length; i++) {//遍历newkey数组
            newObj[newkey[i]] = obj[newkey[i]];//向新创建的对象中按照排好的顺序依次增加键值对
        }
        return newObj;//返回排好序的新对象
    }

</script>
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值