Tìm kiếm mảng Javascript và loại bỏ chuỗi?


132

Tôi có:

var array = new Array();
array.push("A");
array.push("B");
array.push("C");

Tôi muốn có thể làm một cái gì đó như:

array.remove("B");

nhưng không có chức năng loại bỏ. Làm thế nào để tôi thực hiện điều này?


5
Một sự kết hợp .indexOf().splice()nên làm các thủ thuật. Hoặc có thể, thay thế , .filter().
Marc B


Câu trả lời:


185

Tôi thực sự đang cập nhật chủ đề này với một giải pháp 1 dòng gần đây hơn:

let arr = ['A', 'B', 'C'];
arr = arr.filter(e => e !== 'B'); // will return ['A', 'C']

Ý tưởng về cơ bản là để lọc mảng bằng cách chọn tất cả các phần tử khác với phần tử bạn muốn loại bỏ.

Lưu ý: sẽ loại bỏ tất cả các lần xuất hiện.

BIÊN TẬP:

Nếu bạn muốn loại bỏ chỉ xảy ra đầu tiên:

t = ['A', 'B', 'C', 'B'];
t.splice(t.indexOf('B'), 1); // will return ['B'] and t is now equal to ['A', 'C', 'B']

1
Giải pháp này trả về một bản sao của mảng, trong khi sử dụng mối nối sẽ loại bỏ (các) phần tử tại chỗ. Mà bạn chọn phụ thuộc vào bối cảnh.
twhitehead

6
Điều này là hoàn hảo cho công cụ Redux nơi bạn cần trả lại trạng thái mới.
colinwong

@Regis thực sự không, Array.filter trả về một mảng mới. Vì vậy, Array.filter (e => e! == 'B') sẽ không sửa đổi mảng. Hoặc có lẽ tôi đã không hiểu bình luận của bạn một cách chính xác?
Tyrannas

Có một phương pháp để làm điều này nhưng dừng lại ở lần xuất hiện đầu tiên? Vì vậy, nếu có 5 'B chỉ để loại bỏ một?
Ari

1
@Ari Tôi đã cập nhật câu trả lời chỉ xóa một yếu tố
Tyrannas

171

Lặp lại danh sách theo thứ tự ngược lại và sử dụng .splicephương thức.

var array = ['A', 'B', 'C']; // Test
var search_term = 'B';

for (var i=array.length-1; i>=0; i--) {
    if (array[i] === search_term) {
        array.splice(i, 1);
        // break;       //<-- Uncomment  if only the first term has to be removed
    }
}

Thứ tự đảo ngược là quan trọng khi tất cả lần xuất hiện của cụm từ tìm kiếm phải được loại bỏ. Nếu không, bộ đếm sẽ tăng lên, và bạn sẽ bỏ qua các yếu tố.

Khi chỉ có sự xuất hiện đầu tiên phải được loại bỏ, điều sau đây cũng sẽ hoạt động:

var index = array.indexOf(search_term);    // <-- Not supported in <IE9
if (index !== -1) {
    array.splice(index, 1);
}

1
Tôi đoán bởi vì nó có nghĩa là nhanh hơn một chút để lặp lại theo chiều ngược lại.
Ben Clayton

1
@BenClayton: Cảm ơn. FWIW, trong JavaScript, điều đó không đáng tin cậy. Tất nhiên, đếm ngược để 0không tự động nhanh hơn như trong C. Miễn là bạn lưu trữ giới hạn, tất nhiên, điều đó sẽ làm phức tạp mọi thứ nếu bạn tiếp tục sau trận đấu đầu tiên (nhưng không phải nếu bạn dừng lại ở đó).
TJ Crowder

Nếu chúng ta đi tốc độ tại sao không sử dụng trong khi -? : D
Snuffleupagus

11
Đó không phải là về tốc độ, anh ấy thậm chí còn nói như vậy trong câu trả lời của mình. Đó là về các yếu tố SK Picks. Nếu bạn đang ở vị trí 5 và bạn ghép vị trí đó, biểu mẫu phần tử nằm ở vị trí 6 bây giờ là 5 . Tuy nhiên, bộ đếm vòng lặp của bạn tăng lên, lần lặp tiếp theo là vị trí 6 và đó là nơi bạn bỏ qua một mục. Đó là lý do tại sao nó theo thứ tự ngược lại.
amenthes

1
Nếu bạn xóa các mục trong vòng lặp chuyển tiếp và một mục bị xóa, lần lặp cuối cùng có thể đưa ra các ngoại lệ con trỏ null vì nó sẽ tham chiếu một chỉ mục không tồn tại
Drenai

24

Danh sách một Liners

Hãy giải quyết vấn đề này cho mảng này:

var array = ['A', 'B', 'C'];

1. Chỉ xóa phần đầu tiên: Sử dụng Nếu bạn chắc chắn rằng mục đó tồn tại

array.splice(array.indexOf('B'), 1);

2. Chỉ xóa phần cuối cùng: Sử dụng Nếu bạn chắc chắn rằng mục đó tồn tại

array.splice(array.lastIndexOf('B'), 1);

3. Loại bỏ tất cả các lần xuất hiện:

array = array.filter(v => v !== 'B'); 

21

BẢN GIỚI THIỆU

Bạn cần tìm vị trí của những gì bạn đang tìm kiếm .indexOf()sau đó xóa nó bằng.splice()

function remove(arr, what) {
    var found = arr.indexOf(what);

    while (found !== -1) {
        arr.splice(found, 1);
        found = arr.indexOf(what);
    }
}

var array = new Array();
array.push("A");
array.push("B");
array.push("C");
    
remove(array, 'B');
alert(array)​​​​;

Điều này sẽ chăm sóc tất cả các lần xuất hiện.


Đối với các trình duyệt không hỗ trợ, .indexOf()bạn có thể thêm phần này vào tệp javascript của mình.
qwertymk

vâng, thanh lịch. Nếu bạn cần một tùy chọn để chỉ xóa một số thành phần, ví dụ: chỉ phần đầu tiên: cùng cập nhật: jsfiddle.net/qpZFd/9
sebilasse

Tôi luôn nhận được các lỗi sau : Uncaught ReferenceError: array is not defined. Chuyện gì thế?
Pha-trốt

Nếu bạn đang đi tuyến đường này, bạn có thể dễ dàng tận dụng .indexOf()chỉ một chút nữa. Nếu bạn chuyển foundlàm đối số thứ hai cho .indexOf()cuộc gọi trong vòng lặp while , các phần tử trong mảng đã được kiểm tra và kết thúc không bằng nhau sẽ không được kiểm tra lại: found = arr.indexOf(what, found);
pimmooseeling

14

Đơn giản

array.splice(array.indexOf(item), 1);

yeah ngoại trừ indexOf sẽ trở lại -1nếu không tìm thấy gì và rất tiếc, splice sẽ xóa 1 phần tử khỏi cuối mảng
Ricky Tây Ban Nha

2

Giải pháp đơn giản (ES6)

Nếu bạn không có yếu tố trùng lặp

Array.prototype.remove = function(elem) {
  var indexElement = this.findIndex(el => el === elem);
  if (indexElement != -1)
    this.splice(indexElement, 1);
  return this;
};   

Bản demo trực tuyến (fiddle)


Giải pháp này luôn loại bỏ phần tử cuối cùng nếu KHÔNG tìm thấy kết quả khớp.
markus s

1

Bạn phải viết bạn loại bỏ riêng. Bạn có thể lặp qua mảng, lấy chỉ mục của mục bạn muốn xóa và sử dụngsplice để xóa nó.

Ngoài ra, bạn có thể tạo một mảng mới, lặp qua mảng hiện tại và nếu đối tượng hiện tại không khớp với những gì bạn muốn loại bỏ, hãy đặt nó vào một mảng mới.


1

sử dụng:

array.splice(2, 1);

Thao tác này sẽ xóa một mục khỏi mảng, bắt đầu từ chỉ mục 2 (mục thứ 3)


1
thực tế nó sẽ xóa mục thứ hai khỏi mảng, chỉ mục bắt đầu từ 0. tuyên bố này có sự không rõ ràng, ví dụ đơn giản hơn có thể giống như array.splice(2,1)loại bỏ 1 mục tại chỉ mục 2 khỏi mảng. kiểm tra https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice để biết thêm chi tiết
imdzeeshan

1
const changedArray = array.filter( function(value) {
  return value !== 'B'
});

hoặc bạn có thể sử dụng:

const changedArray = array.filter( (value) => value === 'B');

Thay đổiArray sẽ chứa giá trị không có 'B'


0

sử dụng mảng.splice

/*array.splice(index , howMany[, element1[, ...[, elementN]]])

array.splice(index) // SpiderMonkey/Firefox extension*/

array.splice(1,1)

Nguồn: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice


Dấu phẩy giữa arraysplicephải là một dấu chấm.
Cướp W

Đã cố gắng sửa nhưng chính sách của SO nói rằng các chỉnh sửa phải có 6 ký tự trở lên: /
ben_nuttall
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.