2016-03-08 51 views
2

我想将我的数组拆分成一半并将结果保存到另一个数组中,但不影响原始数组。拼接也影响初始数组

所以,如果我有[1,3,9,5]我想将它保存在一个变量。 然后,我会创建新的数组,并复制其中的初始数组。 然后我会把这个新阵列分成两半。

含义到底我将具有2阵列这样

initial [1,3,9,5] 
halved [1,3] 

的问题是,初始一个也被分裂和我得到2阵列与每个一个保持半部的值。

var initial = [1,3,9,5]; 
 

 
var half = initial; 
 

 
half = half.splice(0, Math.floor(half.length/2)); 
 

 
console.log(initial); 
 
console.log(half);

+2

拼接是破坏性的,片不是。 我学会了这一难题。 –

+0

Omg。我猜这里有很多答案让这两个人感到困惑。我知道我做到了。 – Paran0a

回答

1
var half = initial; 

副本initial参考half。他们是同一个阵列。

是复制数组的值与var half = initial.slice();或获得一半

var initial = [1, 3, 9, 5]; 
var half = initial.slice(0, Math.floor(initial.length/2)); 
0

当你做var half = initial;你只传递一个参考,而不是复制一个数组。 您需要使用其它方法来复制的阵列,例如:

var half = initial.slice(); 
+0

我不知道为什么这是downvoted。 – Xufox

1

检查以下内容:

选项1创建初始阵列

var initial = [1,3,9,5]; 

var half = [].concat(initial); 

half = half.splice(0, Math.floor(half.length/2)); 

console.log(initial); 
console.log(half); 

[].concat(initial)的副本允许创建initial阵列的副本。

选项2不要修改初始数组,但使用slice方法

var initial = [1,3,9,5]; 

var half = initial.slice(0, Math.floor(half.length/2)); 

console.log(initial); 
console.log(half); 
+2

虽然您的选项1可以工作,但在使用常规锤子(“切片”)时最好使用大锤。通过使用'concat + splice'你基本上模仿'slice',但效率不高。 –

+0

@SebastienDaniel同意。为了更好地理解问题,显示了2个选项。当然'slice()'是正确的方法。 –

1

你可以像下面这样做

var initial = [1,3,9,5]; 

var half = initial.slice(0, Math.floor(initial.length/2)); 

console.log(initial); 
console.log(half); 
1

马上在分割阵列有两个原型方法:

  • 拼接:一个破坏性版本这会影响原始数组。
  • slice:纯粹的版本,它返回一个新的数组而不影响它所在的​​数组。

var half = initial.slice(0,Math.floor(half.length/2));

只是取代你拼接的使用,你是好去。

欲了解更多信息,我请你向优秀MDN document for Array.spliceMDN document for Array.slice