我只反转ab,但由于ab和bb都反转了,所以我得到了输出。如何克服这个问题?
var ab = [{
c: 1,
b: 3
}, {
a: 1
}]
var bb = new Object(ab)
ab.reverse()
console.log(ab)
console.log(bb)
答案 0 :(得分:1)
使用Object.assign
克隆对象:
var ab = [{c:1, b:3},{a:1}]
var bb = Object.assign([], ab)
ab.reverse()
console.log(ab)
console.log(bb)
答案 1 :(得分:0)
Array#reverse
改变源数组。我相信这可以回答您自己的问题:您指向的是Array#reverse
突变的同一数组!
Array#slice
/ Array#from
/阵列扩展可成功克隆阵列:
var ab = [{
c: 1,
b: 3
}, {
a: 1
}]
const bb = ab.slice(0)
const cc = Array.from(ab)
const dd = [...ab]
ab.reverse()
console.log(ab)
console.log(bb)
console.log(cc)
console.log(dd)
答案 2 :(得分:0)
您需要在反转之前创建另一个数组。 new Object(obj)
仅返回obj
。您可以改用slice
。
var ab = [{c:1, b:3},{a:1}]
var bb= new Object(ab)
console.log(ab === bb);
// create another array
var cb = ab.slice(0);
console.log(ab === cb);
cb.reverse();
console.log(ab);
console.log(cb);
答案 3 :(得分:0)
您可以使用(new Object(ab)).slice(0);
,以便在创建新对象时,它不是ab
的引用,而是新的隔离对象:
var ab = [{c:1, b:3},{a:1}]
var bb= (new Object(ab)).slice(0);
ab.reverse()
console.log(ab)
console.log(bb)
您还可以使用 spread运算符在新对象中克隆对象:
var ab = [{c:1, b:3},{a:1}]
var bb= [...ab];
ab.reverse()
console.log(ab)
console.log(bb)
答案 4 :(得分:0)
反向是一种破坏性功能。它还会更改原始数组。您必须使用切片功能。
var ab = [{c:1, b:3},{a:1}]
var bb= ab.slice()
ab.reverse()
console.log(ab)
console.log(bb)
答案 5 :(得分:0)
一种替代方法是使用函数Array.prototype.concat
在内存中创建一个新实例,然后执行函数reverse
。
Array.prototype.concat()
concat()
方法用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。返回值
一个新的
Array
实例。
var ab = [{c: 1,b: 3}, {a: 1}],
bb = [].concat(ab).reverse();
console.log(ab);
console.log(bb);
.as-console-wrapper { max-height: 100% !important; top: 0; }