对象的反向数组给出相同的输出2

时间:2018-07-23 12:54:34

标签: javascript

我只反转ab,但由于ab和bb都反转了,所以我得到了输出。如何克服这个问题?

var ab = [{
  c: 1,
  b: 3
}, {
  a: 1
}]
var bb = new Object(ab)
ab.reverse()
console.log(ab)
console.log(bb)

6 个答案:

答案 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; }