开发过程中遇到了 js 数组赋值问题,新数组的改变会影响原数组,记录如下:

1
2
3
4
5
6
7
var arr = [1, 2, 3];
console.log(arr); // [1, 2, 3]
var newArr = arr;
console.log(newArr); // [1, 2, 3]
newArr[0] = 2;
console.log(arr); // [2, 2, 3]
console.log(newArr); // [2, 2, 3]

这种情况,赋值的时候使用以下方法就可以实现改变新数组不影响原数组:

1
2
3
4
5
6
7
var arr = [1, 2, 3];
console.log(arr); // [1, 2, 3]
var newArr = [].concat(arr);
console.log(newArr); // [1, 2, 3]
newArr[0] = 2;
console.log(arr); // [1, 2, 3]
console.log(newArr); // [2, 2, 3]

但是,当 arr 为一个对象数组时,以上方法就不可行了,记录如下:

1
2
3
4
5
6
7
8
9
var arr = [{ id: 1, name: "a" }];
console.log(arr); // [{id: 1, name: "a"}]
var newArr = [].concat(arr);
console.log(newArr); // [{id: 1, name: "a"}]
newArr.map((item, index) => {
item.name = "b"
})
console.log(arr); // [{id: 1, name: "b"}]
console.log(newArr); // [{id: 1, name: "b"}]

这种情况,要使用循环创建新数组的方式赋值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var arr = [{ id: 1, name: "a" }];
console.log(arr); // [{id: 1, name: "a"}]
var newArr = [];
$.each(arr, function (i, obj) {
var c = {};
$.each(obj, function (key, val) {
c[key] = val;

});
newArr.push(c)
})
console.log(newArr); // [{id: 1, name: "a"}]
newArr.map((item, index) => {
item.name = "b"
})
console.log(arr); // [{id: 1, name: "a"}]
console.log(newArr); // [{id: 1, name: "b"}]