2012-02-07 31 views
15

Tôi có một mảng tôi muốn chia làm đôi. Vì vậy, tôi có thể định vị nửa đầu ở bên phải và nửa thứ hai ở bên trái.Ghép một mảng thành một nửa, bất kể kích thước là bao nhiêu?

Tôi đã sử dụng chức năng nối trước:

var leftSide = arrayName.splice(0,2); 

Nhưng không chắc chắn làm thế nào để ghép nó trong một nửa không có vấn đề kích thước, vì mảng sẽ thay đổi trong kích thước tự động.

+1

Làm thế nào bạn có thể thấy cách lớn bạn muốn mỗi nửa được? –

+2

-1 bởi vì bạn có thể xác định rằng chỉ bằng cách suy nghĩ về nó. Điểm nửa chừng - đối số cho 'splice' - là khi kích thước mảng là' N'? Và làm thế nào để bạn xác định 'N'? –

+1

nếu có số lẻ thì sao? Không có 'Nửa' .... chỉ cần nói! – Relic

Trả lời

35
var half_length = Math.ceil(arrayName.length/2);  

var leftSide = arrayName.splice(0,half_length); 

sửa đoạn mã sau @Lightness Races trong bình luận của Orbit

+1

'Math.ceil (arrayName.length/2)' có thể thay thế bảy và một dòng thứ ba của mã của bạn, và tránh làm ô nhiễm phạm vi toàn cục để khởi động. –

14

Bạn chỉ có thể tham khảo theo chiều dài của mảng:

var leftSide = arrayName.splice(0, Math.floor(arrayName.length/2)); 

Kể từ .splice() thực sự loại bỏ các yếu tố từ mảng nguồn, các yếu tố còn lại trong mảng sẽ là yếu tố cho nửa bên phải.

Math.floor() sẽ làm tròn xuống để cung cấp cho bên trái ít hơn bên phải cho độ dài lẻ. Bạn có thể sử dụng Math.ceil() nếu bạn muốn làm tròn để cung cấp cho bên trái nhiều hơn bên phải khi độ dài là lẻ.

0

nếu bạn muốn kích thước của mảng ở lại bằng bạn chỉ cần luân phiên hoạt động của mảng bạn viết thư cho (ví dụ, thay thế .push kêu gọi các mảng) .. Tại sao bạn không chỉ tạo 2 mảng lên phía trước?

var lelftHalf = yourArray.splice(0,arrayName.length/2); 

Sau khi bạn làm điều đó nếu bạn muốn giữ lại 2 mảng các thay thế kích thước giống nhau giữa

leftHalf.push(newElement); 

yourArray.push(newElement1); 
1
let leftSide = myArray.splice(0, Math.ceil(myArray.length/2)); 
//The right side is stored in "myArray" 

Ví dụ:

let letters = ['a', 'b', 'c', 'd', 'e']; 
let leftSide = letters.splice(0, Math.ceil(letters.length /2)); 
let rightSide = letters; 
console.log(leftSide); 
=> ['a', 'b', 'c'] 
console.log(rightSide); 
=> ['d', 'e'] 
thông tin

thêm:splice in the MDN docs


Lưu ý rằng điều này sẽ thay đổi mảng ban đầu của bạn. Nếu bạn muốn giữ mảng ban đầu, sao chép mảng, sau đó sử dụng mối nối trên mảng nhân bản. Từ một SO question về mảng nhân bản:

Hiện đã có một CHUẨN MỰC chủ đề huuuge, cung cấp thông tin sau:

  • cho các trình duyệt chớp cắt() là phương pháp nhanh nhất, concat() là chậm hơn một chút và vòng lặp chậm hơn 2,4 lần.

  • cho các trình duyệt khác trong khi vòng lặp là phương pháp nhanh nhất, vì các trình duyệt đó không có tối ưu hóa nội bộ cho slice và concat.

//Fastest for Blink browsers (Opera/Chromium): 
let clonedArray = originalArray.slice(); 
//For other browsers: 
let clonedArray = []; 
var i = myArray.length; 
while (i--) clonedArray[i] = myArray[i]; 
3

Tránh đột biến

Nếu bạn cần phải tránh những đột biến, ví dụ nếu bạn phải chia một mảng trong phản ứng bạn không muốn biến những gốc hoặc nó có thể dẫn đến một số hành vi rất lạ trong ứng dụng của bạn.

Sử dụng Slice

Bạn có thể khắc phục điều này bằng cách sử dụng slice thay vì splice

Ví dụ

let yourArray = props.someArray; 
let halfWayThough = Math.floor(yourArray.length/2) 

let arrayFirstHalf = yourArray.slice(0, halfWayThough); 
let arraySecondHalf = yourArray.slice(halfWayThough, yourArray.length); 
Các vấn đề liên quan