Làm thế nào để dễ dàng cắt ngắn một mảng bằng JavaScript?


102

Linq có một phương thức toán tử thuận tiện được gọi Take()để trả về một số phần tử nhất định trong bất kỳ thứ gì triển khai IEnumerable. Có điều gì tương tự trong jQuery để làm việc với mảng không?

Hoặc, được hỏi khác: làm cách nào để cắt bớt một mảng trong Javascript?


22
Các bạn, vui lòng học JavaScript trước jQuery. Tôi e rằng câu hỏi của ngày mai sẽ là "Những kiểu dữ liệu jQuery nào khác hiển thị bên cạnh Mảng?".
Ionuț G. Stan

Câu trả lời:


184

Có một phương pháp lát

array.slice(0, 4);

Sẽ trả về bốn phần tử đầu tiên.

Đừng quên gán lại nó cho biến của bạn nếu bạn muốn loại bỏ các giá trị khác.

Lưu ý: Đây chỉ là javascript thông thường, không cần jquery.


15
(0,4) sẽ không trả về 4 đầu tiên không phải là 5 đầu tiên?
Simon Keep

11
Điều đó thực sự không đúng. Simon Keep đúng - đối số thứ hai của phương thức .slice () là vị trí mảng sau phần tử cuối cùng được trả về. array.slice (0, 4) sẽ trả về các phần tử 0, 1, 2 và 3 - tổng cộng là 4 phần tử. Hãy coi đối số thứ hai là điểm giới hạn, trong đó .slice (0, x) sẽ trả về tất cả các phần tử từ đầu mảng, lên đến nhưng không bao gồm x.
Bungle

1
endKHÔNG được bao gồm, thì @SimonKeep là đúng, hãy xem MDN developer.mozilla.org/en-US/docs/JavaScript/Reference/…
AsTeR

2
Hãy nhớ để gán nó trở lại vào biến, nó rất quan trọng đơn giản như nó có vẻ
kolexinfos

6
cách tồi, bạn tạo một cá thể mảng mới, hãy ghi nhớ việc sử dụng bộ nhớ khi viết mã js không phải là một ý kiến ​​tồi.
G. Ghez

125

(2 năm sau ...) Nếu bạn thực sự muốn cắt bớt một mảng, bạn cũng có thể sử dụng lengththuộc tính:

var stooges = ["Moe", "Larry", "Shemp", "Curly", "Joe"];
stooges.length = 3; // now stooges is ["Moe", "Larry", "Shemp"]

Lưu ý: nếu bạn gán một chiều dài đó là còn hơn chiều dài hiện nay, các phần tử mảng không xác định được giới thiệu, như hình dưới đây.

var stooges = ["Moe", "Larry", "Shemp"];
stooges.length = 5;
alert(typeof stooges[4]); // alerts "undefined"

BIÊN TẬP:

Như @twhitehead đã đề cập bên dưới, bạn có thể tránh việc thêm các phần tử không xác định bằng cách thực hiện điều này:

var stooges = ["Moe", "Larry", "Shemp"];
stooges.length = Math.min(stooges.length, 5); 
alert(stooges.length)// alerts "3"

5
Tôi đã rất ngạc nhiên đầu tiên khi tôi thấy điều này trong một mã ... Nhưng đó là cách tốt nhất (nếu bạn đang cắt xén từ chỉ số 0) davidwalsh.name/empty-array
kumarharsh

5
Đây là một giải pháp đơn giản đến kinh ngạc.
Dominique

3
Còn việc thu gom rác thì sao?
G. Ghez

1
@JonathanM Trên thực tế, các giá trị null không được giới thiệu; các biến mới không được xác định, vì chúng được khai báo nhưng không được gán bất kỳ giá trị nào.
Håvard Geithus

3
Kinh ngạc! Điều đáng nói là phương pháp này đang sửa đổi giống nhau Arraythay vì tạo mới Array.
Roomy

22

Nếu bạn đang hỏi cách cắt ngắn (sửa đổi mảng bằng cách xóa các phần tử khỏi phần cuối) thì hãy sử dụng splice :

var a1 = [2,4,6,8];
var a2 = a1.splice(-2,2); // a1=[2,4], a2=[6,8]

Nếu bạn đang hỏi làm thế nào để truy xuất một tập hợp con của một mảng mà không cần sửa đổi bản gốc, thì hãy sử dụng slice .

var a1 = [2,4,6,8];
var a2 = a1.slice(-2); // a1=[2,4,6,8], a2=[6,8]

Chỉ cần nhớ splice sửa đổi, cắt các truy cập. Các số âm như đối số đầu tiên cho biết chỉ số từ cuối mảng.


11

Đặt thuộc tính .length thành giá trị thấp hơn.

Tài liệu chính thức: Array.prototype.length


3
để loại bỏ tất cả các phần tử trong mảng, việc đặt độ dài thành 0 là dễ dàng nhất.
hanmari

5

Nếu bạn muốn vừa lấy các phần tử cũng như xóa chúng khỏi mảng, hãy sử dụng splice .

Nếu bạn muốn giữ các phần tử trong mảng, hãy sử dụng slice


1

Nếu bạn muốn kéo các phần tử ra khỏi mảng một cách có chọn lọc, bạn có thể sử dụng phương thức jQuery.grep .

(từ tài liệu jQuery)

var arr = [ 1, 9, 3, 8, 6, 1, 5, 9, 4, 7, 3, 8, 6, 9, 1 ];

$("div").text(arr.join(", "));

arr = jQuery.grep(arr, function(n, i){
  return (n != 5 && i > 4);
});

$("p").text(arr.join(", "));

arr = jQuery.grep(arr, function (a) { return a != 9; });
$("span").text(arr.join(", "));
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.