Làm cách nào để bỏ đặt một phần tử trong một mảng trong javascript?


138

Làm cách nào để xóa khóa 'thanh' khỏi một mảng foo để 'thanh' không hiển thị trong

for(key in foo){alert(key);}

Câu trả lời:


243

Không sử dụng xóa vì nó sẽ không xóa phần tử khỏi một mảng, nó sẽ chỉ đặt nó là không xác định, sau đó sẽ không được phản ánh chính xác theo chiều dài của mảng.

Nếu bạn biết chìa khóa, bạn nên sử dụng splice tức là

myArray.splice(key, 1);

Đối với ai đó ở vị trí của Steven, bạn có thể thử một cái gì đó như thế này:

for (var key in myArray) {
    if (key == 'bar') {
        myArray.splice(key, 1);
    }
}

hoặc là

for (var key in myArray) {
    if (myArray[key] == 'bar') {
        myArray.splice(key, 1);
    }
}

3
+1 Điểm hay, tôi cũng thích cách này: ejohn.org/blog/javascript-array-remove
CMS

3
@ThiefMaster - Muốn giải thích? Tôi không biết điều đó có nghĩa là gì và muốn học. Như mọi khi, một chỉnh sửa tốt hơn 1.000.000 lần so với nhận xét trái tay; bạn nên biết rằng với số lượng đại diện bạn có.
đi

21
Sử dụng for (var key in myArray)thay vì for (key in myArray)- nếu không keylà biến toàn cục và nếu bạn gọi một hàm bên trong vòng lặp đó có cùng một vấn đề, bạn sẽ nhận được kết quả không mong muốn.
ThiefMaster

2
Lưu ý, ví dụ thứ hai không hoạt động nếu mảng có nhiều mục liên tiếp khớp với 'thanh'. Chỉ mục của mảng sẽ thay đổi và bạn sẽ bỏ lỡ một nửa các mục. Thay vào đó, hãy sử dụng vòng lặp for làm giảm chỉ số khi tìm thấy kết quả khớp.
Dave Lancea

Đối với một loạt các đối tượng: stackoverflow.com/questions/15287865/
Kẻ

52
delete foo[key];

: D


4
về mặt kỹ thuật không trả lời câu hỏi. anh ấy đang tìm cách tháo chìa khóa 'thanh'. và biến chính của bạn không ngụ ý điều đó. : P
Kon

4
khóa = 'thanh'; eval ("xóa foo." + phím); ẩn ; D
olliej

3
Đừng KHÔNG sử dụng eval. Xóa khóa / chỉ mục của một đối tượng / mảng có thể đạt được bằng các phương pháp đơn giản hơn nhiều không sử dụng eval.
Dinei

4
Trên thực tế nếu bạn xóa khỏi mảng được lập chỉ mục bằng cách xóa foo [key], nó sẽ lưu giá trị trong foo [key] = không xác định và foo.length sẽ vẫn như vậy. Vì vậy, sử dụng Splice thay
Павел Иванов

sử dụng xóa foo [key] nó sai; nên sử dụng foo.splice (khóa, 1);
vnguyen

38

Một lưu ý quan trọng: Mảng JavaScript không phải là mảng kết hợp như những mảng bạn có thể được sử dụng từ PHP. Nếu "khóa mảng" của bạn là một chuỗi, thì bạn không còn hoạt động trên nội dung của một mảng. Mảng của bạn là một đối tượng và bạn đang sử dụng ký hiệu ngoặc để truy cập thành viên có tên <tên khóa>. Như vậy:

var myArray = [];
myArray ["bar"] = true;
myArray ["foo"] = true;
cảnh báo (myArray.length); // trả về 0.

bởi vì bạn chưa thêm các phần tử vào mảng, nên bạn chỉ sửa đổi thanh thành viên của myArray và foo.


37

Nếu bạn biết tên khóa đơn giản chỉ cần làm như thế này:

delete array['key_name']

2
Đây không phải là một mảng! Đó là một đối tượng (vâng, chúng được gọi là mảng kết hợp trong JS, nhưng không, chúng không thực sự và phương thức này có hại nếu bạn thực sự làm việc với một mảng JS).
Wintercount

3

Đây là cách tôi sẽ làm

 myArray.splice( myArray.indexOf('bar') , 1) 

1
Phương thức Array.prototype.indexOf () tìm kiếm một giá trị trong một mảng, không phải cho một khóa. Vì vậy, điều này sẽ không hoạt động.
Nadav

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.