it-swarm-vi.com

Làm cách nào để xóa một phần tử cụ thể khỏi một mảng trong JavaScript?

Tôi có một mảng Số và tôi đang sử dụng phương thức .Push() để thêm các phần tử vào đó.

Có một cách đơn giản để loại bỏ một yếu tố cụ thể khỏi một mảng? Tương đương với một cái gì đó như array.remove(number);.

Tôi phải sử dụng core JavaScript - no framework được cho phép.

6816
Walker

Tìm index của phần tử mảng mà bạn muốn xóa, sau đó xóa chỉ mục đó bằng splice .

Phương thức splice () thay đổi nội dung của một mảng bằng cách loại bỏ các yếu tố hiện có và/hoặc thêm các yếu tố mới.

var array = [2, 5, 9];
console.log(array)
var index = array.indexOf(5);
if (index > -1) {
  array.splice(index, 1);
}
// array = [2, 9]
console.log(array);

Tham số thứ hai của splice là số phần tử cần loại bỏ. Lưu ý rằng splice sửa đổi mảng tại chỗ và trả về một mảng mới chứa các phần tử đã bị xóa.

9908
Tom Wadley

Tôi không biết bạn đang mong đợi array.remove(int) hành xử như thế nào. Có ba khả năng tôi có thể nghĩ rằng bạn có thể muốn.

Để xóa phần tử của một mảng tại một chỉ mục i:

array.splice(i, 1);

Nếu bạn muốn xóa mọi phần tử có giá trị number khỏi mảng:

for(var i = array.length - 1; i >= 0; i--) {
    if(array[i] === number) {
       array.splice(i, 1);
    }
}

Nếu bạn chỉ muốn làm cho phần tử ở chỉ mục i không còn tồn tại, nhưng bạn không muốn chỉ mục của các phần tử khác thay đổi:

delete array[i];
1011
Peter Olson

Chỉnh sửa vào tháng 10 năm 2016

  • Làm điều đó đơn giản, trực quan và rõ ràng ( https://en.wikipedia.org/wiki/Occam%27s_razor )
  • Làm điều đó bất biến (mảng ban đầu không thay đổi)
  • Làm điều đó với các hàm JS tiêu chuẩn, nếu trình duyệt của bạn không hỗ trợ chúng - sử dụng polyfill

Trong ví dụ mã này tôi sử dụng hàm "Array.filter (...)" để xóa các mục không mong muốn khỏi mảng, hàm này không thay đổi mảng ban đầu và tạo một mảng mới. Nếu trình duyệt của bạn không hỗ trợ chức năng này (ví dụ: IE trước phiên bản 9 hoặc Firefox trước phiên bản 1.5), hãy xem xét sử dụng bộ lọc polyfill từ Mozilla .

Xóa mục (mã ECMA-262 Phiên bản 5 hay còn gọi là JS kiểu cũ)

var value = 3

var arr = [1, 2, 3, 4, 5, 3]

arr = arr.filter(function(item) { 
    return item !== value
})

console.log(arr)
// [ 1, 2, 4, 5 ]

Xóa mục (mã ES2015)

let value = 3

let arr = [1, 2, 3, 4, 5, 3]

arr = arr.filter(item => item !== value)

console.log(arr)
// [ 1, 2, 4, 5 ]

Cú pháp hàm mũi tên QUAN TRỌNG ES2015 "() => {}" hoàn toàn không được hỗ trợ trong IE, Chrome trước 45 phiên bản, Firefox trước 22 phiên bản, Safari trước 10 phiên bản. Để sử dụng cú pháp ES2015 trong các trình duyệt cũ, bạn có thể sử dụng BabelJS


Xóa nhiều mục (mã ES2016)

Một lợi thế bổ sung của phương pháp này là bạn có thể loại bỏ nhiều mục

let forDeletion = [2, 3, 5]

let arr = [1, 2, 3, 4, 5, 3]

arr = arr.filter(item => !forDeletion.includes(item))
// !!! Read below about array.includes(...) support !!!

console.log(arr)
// [ 1, 4 ]

Hàm QUAN TRỌNG "Array.includes (...)" hoàn toàn không được hỗ trợ trong IE, Chrome trước phiên bản 47, Firefox trước phiên bản 43, Safari trước phiên bản 9 và Edge trước phiên bản 14 đây là polyfill từ Mozilla

Xóa nhiều mục (JavaScript ES2018 thử nghiệm tiên tiến?)

// array-lib.js

export function remove(...forDeletion) {
    return this.filter(item => !forDeletion.includes(item))
}

// main.js

import { remove } from './array-lib.js'

let arr = [1, 2, 3, 4, 5, 3]

// :: This-Binding Syntax Proposal
// using "remove" function as "virtual method"
// without extending Array.prototype
arr = arr::remove(2, 3, 5)

console.log(arr)
// [ 1, 4 ]

Hãy tự thử trong BabelJS :)

Tài liệu tham khảo

831
Ujeenator

Phụ thuộc vào việc bạn có muốn giữ một vị trí trống hay không.

Nếu bạn muốn có một chỗ trống, hãy xóa đi:

delete array[ index ];

Nếu bạn không, bạn nên sử dụng phương thức splice :

array.splice( index, 1 );

Và nếu bạn cần giá trị của mục đó, bạn chỉ có thể lưu trữ phần tử của mảng được trả về:

var value = array.splice( index, 1 )[0];

Trong trường hợp bạn muốn thực hiện theo một số thứ tự, bạn có thể sử dụng array.pop() cho cái cuối cùng hoặc array.shift() cho cái đầu tiên (và cả hai cũng trả về giá trị của vật phẩm).

Và nếu bạn không biết chỉ mục của vật phẩm, bạn có thể sử dụng array.indexOf( item ) để lấy nó (trong if() để lấy một vật phẩm hoặc trong while() để lấy tất cả chúng). array.indexOf( item ) trả về chỉ mục hoặc -1 nếu không tìm thấy.

383
xavierm02

Một người bạn đã gặp vấn đề trong Internet Explorer 8 , và cho tôi thấy những gì anh ta đã làm. Tôi nói với anh ấy là sai, và anh ấy nói với tôi rằng anh ấy đã có câu trả lời ở đây. Câu trả lời hàng đầu hiện tại sẽ không hoạt động trong tất cả các trình duyệt (ví dụ Internet Explorer 8) và nó sẽ chỉ xóa lần xuất hiện đầu tiên của mục.

Xóa TẤT CẢ các trường hợp khỏi một mảng

function remove(arr, item) {
    for (var i = arr.length; i--;) {
        if (arr[i] === item) {
            arr.splice(i, 1);
        }
    }
}

Nó lặp qua mảng ngược (vì các chỉ số và độ dài sẽ thay đổi khi các mục bị xóa) và xóa mục nếu tìm thấy. Nó hoạt động trong tất cả các trình duyệt.

251
Ben Lesh

Có hai cách tiếp cận chính:

  1. mối nối (): anArray.splice(index, 1);

  2. xóa: delete anArray[index];

Hãy cẩn thận khi bạn sử dụng xóa cho một mảng. Nó là tốt để xóa các thuộc tính của các đối tượng nhưng không tốt cho mảng. Tốt hơn là sử dụng splice cho mảng.

Hãy nhớ rằng khi bạn sử dụng delete cho một mảng, bạn có thể nhận được kết quả sai cho anArray.length. Nói cách khác, delete sẽ xóa phần tử nhưng sẽ không cập nhật giá trị của thuộc tính độ dài.

Bạn cũng có thể mong đợi có lỗ hổng trong số chỉ mục sau khi sử dụng xóa, ví dụ: bạn có thể kết thúc với việc có các chỉ mục 1,3,4,8,9,11 và độ dài như trước khi sử dụng xóa. Trong trường hợp đó, tất cả các vòng lặp for được lập chỉ mục sẽ bị sập, vì các chỉ mục không còn tuần tự.

Nếu bạn buộc phải sử dụng delete vì một số lý do, thì bạn nên sử dụng for each vòng khi bạn cần lặp qua các mảng. Vì thực tế, luôn luôn tránh sử dụng lập chỉ mục cho các vòng lặp, nếu có thể. Bằng cách đó, mã sẽ mạnh mẽ hơn và ít gặp vấn đề với các chỉ mục.

142
Sasa
Array.prototype.remByVal = function(val) {
    for (var i = 0; i < this.length; i++) {
        if (this[i] === val) {
            this.splice(i, 1);
            i--;
        }
    }
    return this;
}
//Call like
[1, 2, 3, 4].remByVal(3);

Array.prototype.remByVal = function(val) {
    for (var i = 0; i < this.length; i++) {
        if (this[i] === val) {
            this.splice(i, 1);
            i--;
        }
    }
    return this;
}

var rooms = ['hello', 'something']

rooms = rooms.remByVal('hello')

console.log(rooms)

118
Zirak

Không cần sử dụng indexOf hoặc splice. Tuy nhiên, nó hoạt động tốt hơn nếu bạn chỉ muốn loại bỏ một lần xuất hiện của một phần tử. 

Tìm và di chuyển (di chuyển):

function move(arr, val) {
  var j = 0;
  for (var i = 0, l = arr.length; i < l; i++) {
    if (arr[i] !== val) {
      arr[j++] = arr[i];
    }
  }
  arr.length = j;
}

Sử dụng indexOfsplice (indexof):

function indexof(arr, val) {
  var i;
  while ((i = arr.indexOf(val)) != -1) {
    arr.splice(i, 1);
  }
}

Chỉ sử dụng splice (mối nối):

function splice(arr, val) {
  for (var i = arr.length; i--;) {
    if (arr[i] === val) {
      arr.splice(i, 1);
    }
  }
}

Thời gian chạy trên nodejs cho mảng có 1000 phần tử (trung bình hơn 10000 lần chạy):

indexof chậm hơn khoảng 10 lần so với di chuyển. Ngay cả khi được cải thiện bằng cách xóa cuộc gọi đến indexOf trong splice, nó vẫn hoạt động kém hơn nhiều so với move

Remove all occurrences:
    move 0.0048 ms
    indexof 0.0463 ms
    splice 0.0359 ms

Remove first occurrence:
    move_one 0.0041 ms
    indexof_one 0.0021 ms
87
slosd

Quá cũ để trả lời, nhưng nó có thể giúp ai đó, bằng cách cung cấp một vị ngữ thay vì một giá trị.

LƯU Ý: nó sẽ cập nhật mảng đã cho và trả về các hàng bị ảnh hưởng

Sử dụng

var removed = helper.removeOne(arr, row => row.id === 5 );

var removed = helper.remove(arr, row => row.name.startsWith('BMW'));

Định nghĩa

var helper = {

    // Remove and return the first occurrence     

    removeOne: function(array, predicate) {
        for (var i = 0; i < array.length; i++) {
            if (predicate(array[i])) {
                return array.splice(i, 1);
            }
        }
    },

    // Remove and return all occurrences  

    remove: function(array, predicate) {
        var removed = [];

        for (var i = 0; i < array.length;) {

            if (predicate(array[i])) {
                removed.Push(array.splice(i, 1));
                continue;
            }

            i++;                
        }

        return removed;
    }
};
59
amd

John Resig đã đăng một triển khai tốt :

// Array Remove - By John Resig (MIT Licensed)
Array.prototype.remove = function(from, to) {
  var rest = this.slice((to || from) + 1 || this.length);
  this.length = from < 0 ? this.length + from : from;
  return this.Push.apply(this, rest);
};

Nếu bạn không muốn mở rộng một đối tượng toàn cầu, thay vào đó, bạn có thể làm một cái gì đó như sau:

// Array Remove - By John Resig (MIT Licensed)
Array.remove = function(array, from, to) {
    var rest = array.slice((to || from) + 1 || array.length);
    array.length = from < 0 ? array.length + from : from;
    return array.Push.apply(array, rest);
};

Nhưng lý do chính tôi đăng bài này là để cảnh báo người dùng chống lại việc triển khai thay thế được đề xuất trong các nhận xét trên trang đó (ngày 14 tháng 12 năm 2007):

Array.prototype.remove = function(from, to){
  this.splice(from, (to=[0,from||1,++to-from][arguments.length])<0?this.length+to:to);
  return this.length;
};

Nó có vẻ hoạt động tốt lúc đầu, nhưng qua một quá trình đau đớn, tôi phát hiện ra nó thất bại khi cố gắng loại bỏ phần tử thứ hai đến phần cuối trong một mảng. Ví dụ: nếu bạn có mảng 10 phần tử và bạn cố gắng loại bỏ phần tử thứ 9 bằng phần này:

myArray.remove(8);

Bạn kết thúc với một mảng 8 phần tử. Không biết tại sao nhưng tôi xác nhận việc triển khai ban đầu của John không có vấn đề này.

56
Roger

Underscore.js có thể được sử dụng để giải quyết các vấn đề với nhiều trình duyệt. Nó sử dụng các phương thức trình duyệt trong xây dựng nếu có. Nếu chúng vắng mặt như trong trường hợp các phiên bản Internet Explorer cũ hơn, nó sử dụng các phương thức tùy chỉnh của riêng nó.

Một ví dụ đơn giản để xóa các thành phần khỏi mảng (khỏi trang web):

_.without([1, 2, 1, 0, 3, 1, 4], 0, 1); // => [2, 3, 4]
54
vatsal

Bạn có thể thực hiện dễ dàng với bộ lọc phương thức:

function remove(arrOriginal, elementToRemove){
    return arrOriginal.filter(function(el){return el !== elementToRemove});
}
console.log( remove([1, 2, 1, 0, 3, 1, 4], 1) );

Điều này loại bỏ tất cả các phần tử khỏi mảng và cũng hoạt động nhanh hơn sau đó kết hợp giữa lát cắt và indexOf

53
Salvador Dali

Nếu bạn muốn một mảng mới với các vị trí bị xóa, bạn luôn có thể xóa phần tử cụ thể và lọc ra mảng. Nó có thể cần một phần mở rộng của đối tượng mảng cho các trình duyệt không triển khai phương thức lọc nhưng về lâu dài thì dễ dàng hơn vì tất cả những gì bạn làm là:

var my_array = [1,2,3,4,5,6];
delete my_array[4];
console.log(my_array.filter(function(a){return typeof a !== 'undefined';}));

Nên hiển thị [1, 2, 3, 4, 6]

42
Loupax

Bạn có thể sử dụng ES6. 

var array=['1','2','3','4','5','6']
var index = array.filter((value)=>value!='3');

Đầu ra: 

["1", "2", "4", "5", "6"]
38
rajat44

Kiểm tra mã này. Nó hoạt động trong mọi trình duyệt chính .

remove_item = function (arr, value) {
    var b = '';
    for (b in arr) {
        if (arr[b] === value) {
            arr.splice(b, 1);
            break;
        }
    }
    return arr;
}

Gọi chức năng này 

remove_item(array,value);
35
Ekramul Hoque

Bạn có thể sử dụng lodash _.pull (mảng biến đổi), _.pullAt (mảng biến đổi) hoặc _.without (không biến đổi mảng), 

var array1 = ['a', 'b', 'c', 'd']
_.pull(array1, 'c')
console.log(array1) // ['a', 'b', 'd']

var array2 = ['e', 'f', 'g', 'h']
_.pullAt(array2, 0)
console.log(array2) // ['f', 'g', 'h']

var array3 = ['i', 'j', 'k', 'l']
var newArray = _.without(array3, 'i') // ['j', 'k', 'l']
console.log(array3) // ['i', 'j', 'k', 'l']
33
Chun Yang

OK, ví dụ bạn đang có mảng bên dưới:

var num = [1, 2, 3, 4, 5];

Và chúng tôi muốn xóa số 4, bạn chỉ cần thực hiện mã dưới đây:

num.splice(num.indexOf(4), 1); //num will be [1, 2, 3, 5];

Nếu bạn sử dụng lại chức năng này, bạn viết một hàm có thể tái sử dụng sẽ được gắn vào hàm mảng gốc như bên dưới:

Array.prototype.remove = Array.prototype.remove || function(x) {
  const i = this.indexOf(x);
  if(i===-1) return;
  this.splice(i, 1); //num.remove(5) === [1, 2, 3];
}

Nhưng làm thế nào nếu bạn có mảng dưới đây thay vì vài [5] trong Mảng?

var num = [5, 6, 5, 4, 5, 1, 5];

Chúng tôi cần một vòng lặp để kiểm tra tất cả, nhưng cách dễ dàng và hiệu quả hơn là sử dụng các hàm JavaScript tích hợp, vì vậy chúng tôi viết một hàm sử dụng bộ lọc như dưới đây:

const _removeValue = (arr, x) => arr.filter(n => n!==x);
//_removeValue([1, 2, 3, 4, 5, 5, 6, 5], 5) //return [1, 2, 3, 4, 6]

Ngoài ra, còn có các thư viện bên thứ ba giúp bạn thực hiện việc này, như Lodash hoặc Underscore, để biết thêm thông tin, hãy xem lodash _.pull, _.pullAt hoặc _.without.

32
Alireza

Tôi khá mới với JavaScript và cần chức năng này. Tôi chỉ viết điều này:

function removeFromArray(array, item, index) {
  while((index = array.indexOf(item)) > -1) {
    array.splice(index, 1);
  }
}

Sau đó, khi tôi muốn sử dụng nó:

//Set-up some dummy data
var dummyObj = {name:"meow"};
var dummyArray = [dummyObj, "item1", "item1", "item2"];

//Remove the dummy data
removeFromArray(dummyArray, dummyObj);
removeFromArray(dummyArray, "item2");

Đầu ra - Như mong đợi . ["Item1", "item1"]

Bạn có thể có những nhu cầu khác với tôi, vì vậy bạn có thể dễ dàng sửa đổi nó cho phù hợp với họ. Tôi hi vọng điêu nay se giup được ai đo.

27
sofiax

ES6 & không có đột biến: (Tháng 10 năm 2016)

const removeByIndex = (list, index) =>
  [
    ...list.slice(0, index),
    ...list.slice(index + 1)
  ];

Sau đó : 

removeByIndex([33,22,11,44],1) //=> [33,11,44]
24
Abdennour TOUMI

Cập nhật: Phương pháp này chỉ được khuyến nghị nếu bạn không thể sử dụng ECMAScript 2015 (trước đây gọi là ES6). Nếu bạn có thể sử dụng nó, các câu trả lời khác ở đây cung cấp nhiều triển khai gọn gàng hơn.


Gist này ở đây sẽ giải quyết vấn đề của bạn và cũng xóa tất cả các lần xuất hiện của đối số thay vì chỉ 1 (hoặc một giá trị được chỉ định).

Array.prototype.destroy = function(obj){
    // Return null if no objects were found and removed
    var destroyed = null;

    for(var i = 0; i < this.length; i++){

        // Use while-loop to find adjacent equal objects
        while(this[i] === obj){

            // Remove this[i] and store it within destroyed
            destroyed = this.splice(i, 1)[0];
        }
    }

    return destroyed;
}

Sử dụng:

var x = [1, 2, 3, 3, true, false, undefined, false];

x.destroy(3);         // => 3
x.destroy(false);     // => false
x;                    // => [1, 2, true, undefined]

x.destroy(true);      // => true
x.destroy(undefined); // => undefined
x;                    // => [1, 2]

x.destroy(3);         // => null
x;                    // => [1, 2]
22
zykadelic

Nếu bạn có các đối tượng phức tạp trong mảng, bạn có thể sử dụng các bộ lọc? Trong các tình huống mà $ .inArray hoặc mảng.splice không dễ sử dụng. Đặc biệt là nếu các đối tượng có lẽ nông trong mảng.

Ví dụ. nếu bạn có một đối tượng với trường Id và bạn muốn xóa đối tượng khỏi một mảng:

this.array = this.array.filter(function(element, i) {
    return element.id !== idToRemove;
});
21
flurdy

Dưới đây là một vài cách để xóa một mục khỏi một mảng bằng JavaScript.

Tất cả phương thức được mô tả không làm thay đổi mảng ban đầu, và thay vào đó tạo một mảng mới.

Nếu bạn biết chỉ số của một mặt hàng

Giả sử bạn có một mảng và bạn muốn xóa một mục ở vị trí i.

Một phương pháp là sử dụng slice():

const items = ['a', 'b', 'c', 'd', 'e', 'f']
const i = 3
const filteredItems = items.slice(0, i-1).concat(items.slice(i, items.length))

console.log(filteredItems)

slice() tạo ra một mảng mới với các chỉ mục mà nó nhận được. Chúng ta chỉ cần tạo một mảng mới, từ đầu đến chỉ mục mà chúng ta muốn loại bỏ và nối một mảng khác từ vị trí đầu tiên theo sau mảng chúng ta đã xóa đến cuối mảng.

Nếu bạn biết giá trị

Trong trường hợp này, một tùy chọn tốt là sử dụng filter(), cung cấp cách tiếp cận khai báo hơn:

const items = ['a', 'b', 'c', 'd', 'e', 'f']
const valueToRemove = 'c'
const filteredItems = items.filter(item => item !== valueToRemove)

console.log(filteredItems)

Điều này sử dụng các chức năng mũi tên ES6. Bạn có thể sử dụng các chức năng truyền thống để hỗ trợ các trình duyệt cũ hơn:

const items = ['a', 'b', 'c', 'd', 'e', 'f']
const valueToRemove = 'c'
const filteredItems = items.filter(function(item) {
  return item !== valueToRemove
})

console.log(filteredItems)

hoặc bạn có thể sử dụng Babel và dịch mã ES6 trở lại ES5 để dễ đọc hơn với các trình duyệt cũ, nhưng vẫn viết JavaScript hiện đại trong mã của bạn.

Loại bỏ nhiều mục

Điều gì nếu thay vì một mục duy nhất, bạn muốn loại bỏ nhiều mục?

Hãy tìm giải pháp đơn giản nhất.

Theo chỉ số

Bạn chỉ có thể tạo một hàm và xóa các mục trong chuỗi:

const items = ['a', 'b', 'c', 'd', 'e', 'f']

const removeItem = (items, i) =>
  items.slice(0, i-1).concat(items.slice(i, items.length))

let filteredItems = removeItem(items, 3)
filteredItems = removeItem(filteredItems, 5)
//["a", "b", "c", "d"]

console.log(filteredItems)

Theo giá trị

Bạn có thể tìm kiếm để đưa vào bên trong chức năng gọi lại:

const items = ['a', 'b', 'c', 'd', 'e', 'f']
const valuesToRemove = ['c', 'd']
const filteredItems = items.filter(item => !valuesToRemove.includes(item))
// ["a", "b", "e", "f"]

console.log(filteredItems)

Tránh làm biến đổi mảng ban đầu

splice() (không bị nhầm lẫn với slice()) làm thay đổi mảng ban đầu và nên tránh.

(ban đầu được đăng tại https://flaviocopes.com/how-to-remove-item-from-array/ )

20
Flavio Copes

Bạn không bao giờ nên thay đổi mảng của bạn mảng của bạn. Vì điều này là chống lại mô hình lập trình chức năng. Những gì bạn có thể làm là tạo một mảng mới mà không cần tham chiếu mảng bạn muốn thay đổi dữ liệu bằng cách sử dụng phương thức es6 filter;

var myArray = [1,2,3,4,5,6];

Giả sử bạn muốn xóa 5 khỏi mảng, bạn có thể chỉ cần làm như thế này.

myArray = myArray.filter(value => value !== 5);

Điều này sẽ cung cấp cho bạn một mảng mới mà không có giá trị bạn muốn loại bỏ. Vì vậy, kết quả sẽ là

 [1,2,3,4,6]; // 5 has been removed from this array

Để hiểu thêm, bạn có thể đọc tài liệu MDN trên Array.filter https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

19
Adeel Imran

Một cách tiếp cận hiện đại hơn, ECMAScript 2015 (trước đây gọi là Harmony hoặc ES 6). Được:

const items = [1, 2, 3, 4];
const index = 2;

Sau đó:

items.filter((x, i) => i !== index);

Năng suất: 

[1, 2, 4]

Bạn có thể sử dụng Babel và a dịch vụ polyfill để đảm bảo điều này được hỗ trợ tốt trên các trình duyệt.

18
bjfletcher

Tôi biết đã có rất nhiều câu trả lời, nhưng nhiều trong số chúng dường như quá phức tạp hóa vấn đề. Đây là một cách đơn giản, đệ quy để xóa tất cả các phiên bản của khóa - tự gọi cho đến khi không tìm thấy chỉ mục. Có, nó chỉ hoạt động trong các trình duyệt có indexOf, nhưng nó đơn giản và có thể dễ dàng được điền.

Chức năng độc lập

function removeAll(array, key){
    var index = array.indexOf(key);

    if(index === -1) return;

    array.splice(index, 1);
    removeAll(array,key);
}

Phương pháp nguyên mẫu

Array.prototype.removeAll = function(key){
    var index = this.indexOf(key);

    if(index === -1) return;

    this.splice(index, 1);
    this.removeAll(key);
}
16
wharding28

Tôi có một giải pháp tốt khác để xóa khỏi một mảng:

var words = ['spray', 'limit', 'Elite', 'exuberant', 'destruction', 'present'];

const result = words.filter(Word => Word.length > 6);

console.log(result);
// expected output: Array ["exuberant", "destruction", "present"]

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

15
Aram Grigoryan

Bạn có thể thực hiện một vòng lặp ngược để đảm bảo không làm hỏng các chỉ mục, nếu có nhiều phiên bản của phần tử.

var myElement = "chocolate";
var myArray = ['chocolate', 'poptart', 'poptart', 'poptart', 'chocolate', 'poptart', 'poptart', 'chocolate'];

/* Important code */
for (var i = myArray.length - 1; i >= 0; i--) {
    if (myArray[i] == myElement) myArray.splice(i, 1);
}

Bản thử trực tiếp

15
Jeff Noel

Dựa trên tất cả các câu trả lời chủ yếu là đúng và có tính đến các thực tiễn tốt nhất được đề xuất (đặc biệt là không sử dụng trực tiếp Array.prototype), tôi đã đưa ra mã dưới đây:

function arrayWithout(arr, values) {
  var isArray = function(canBeArray) {
    if (Array.isArray) {
      return Array.isArray(canBeArray);
    }
    return Object.prototype.toString.call(canBeArray) === '[object Array]';
  };

  var excludedValues = (isArray(values)) ? values : [].slice.call(arguments, 1);
  var arrCopy = arr.slice(0);

  for (var i = arrCopy.length - 1; i >= 0; i--) {
    if (excludedValues.indexOf(arrCopy[i]) > -1) {
      arrCopy.splice(i, 1);
    }
  }

  return arrCopy;
}

Xem xét chức năng trên, mặc dù thực tế là nó hoạt động tốt, tôi nhận ra rằng có thể có một số cải tiến hiệu suất. Ngoài ra sử dụng ES6 thay vì ES5 là một cách tiếp cận tốt hơn nhiều. Cuối cùng, đây là mã được cải tiến:

const arrayWithoutFastest = (() => {
  const isArray = canBeArray => ('isArray' in Array) 
    ? Array.isArray(canBeArray) 
    : Object.prototype.toString.call(canBeArray) === '[object Array]';

  let mapIncludes = (map, key) => map.has(key);
  let objectIncludes = (obj, key) => key in obj;
  let includes;

  function arrayWithoutFastest(arr, ...thisArgs) {
    let withoutValues = isArray(thisArgs[0]) ? thisArgs[0] : thisArgs;

    if (typeof Map !== 'undefined') {
      withoutValues = withoutValues.reduce((map, value) => map.set(value, value), new Map());
      includes = mapIncludes;
    } else {
      withoutValues = withoutValues.reduce((map, value) => { map[value] = value; return map; } , {}); 
      includes = objectIncludes;
    }

    const arrCopy = [];
    const length = arr.length;

    for (let i = 0; i < length; i++) {
      // If value is not in exclude list
      if (!includes(withoutValues, arr[i])) {
        arrCopy.Push(arr[i]);
      }
    }

    return arrCopy;
  }

  return arrayWithoutFastest;  
})();

Cách sử dụng:

const arr = [1,2,3,4,5,"name", false];

arrayWithoutFastest(arr, 1); // will return array [2,3,4,5,"name", false]
arrayWithoutFastest(arr, 'name'); // will return [2,3,4,5, false]
arrayWithoutFastest(arr, false); // will return [2,3,4,5]
arrayWithoutFastest(arr,[1,2]); // will return [3,4,5,"name", false];
arrayWithoutFastest(arr, {bar: "foo"}); // will return the same array (new copy)

Tôi hiện đang viết một bài đăng trên blog trong đó tôi đã điểm chuẩn một số giải pháp cho Array mà không gặp vấn đề gì và so sánh thời gian cần thiết để chạy. Tôi sẽ cập nhật câu trả lời này với liên kết khi tôi hoàn thành bài đăng đó. Chỉ để cho bạn biết, tôi đã so sánh những điều trên với lodash mà không có và trong trường hợp trình duyệt hỗ trợ Map, nó đánh bại lodash! Lưu ý rằng tôi không sử dụng Array.prototype.indexOf hoặc Array.prototype.includes khi gói exlcudeValues ​​trong Map hoặc Object giúp truy vấn nhanh hơn!

15
Ardi

Bạn có 1 đến 9 mảng và bạn muốn loại bỏ 5 sử dụng mã bên dưới.

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

var newNumberArray = numberArray.filter(m => {
  return m !== 5;
});

console.log("new Array, 5 removed", newNumberArray);


Nếu bạn muốn nhiều giá trị cũ: - 1,7,8

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

var newNumberArray = numberArray.filter(m => {
  return (m !== 1) && (m !== 7) && (m !== 8);
});

console.log("new Array, 5 removed", newNumberArray);


Nếu bạn muốn xóa giá trị mảng trong mảng ex: - [3,4,5]

var numberArray = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var removebleArray = [3,4,5];

var newNumberArray = numberArray.filter(m => {
    return !removebleArray.includes(m);
});

console.log("new Array, [3,4,5] removed", newNumberArray);

bao gồm trình duyệt được hỗ trợ là link

14
Thilina Sampath
  Array.prototype.removeItem = function(a) {
            for (i = 0; i < this.length; i++) {
                if (this[i] == a) {
                    for (i2 = i; i2 < this.length - 1; i2++) {
                        this[i2] = this[i2 + 1];
                    }
                    this.length = this.length - 1
                    return;
                }
            }
        }

    var recentMovies = ['Iron Man', 'Batman', 'Superman', 'Spiderman'];
    recentMovies.removeItem('Superman');
13
Don Vincent Preziosi

Xóa theo chỉ mục

Hàm trả về một bản sao của mảng mà không có phần tử tại chỉ mục.

/**
* removeByIndex
* @param {Array} array
* @param {Number} index
*/
function removeByIndex(array, index){
    return array.filter(function(elem, _index){
        return index != _index;
    });
}
l = [1,3,4,5,6,7];
console.log(removeByIndex(l, 1));

$> [ 1, 4, 5, 6, 7 ]

Xóa theo Giá trị

Hàm trả về một bản sao của mảng mà không có Giá trị.

/**
* removeByValue
* @param {Array} array
* @param {Number} value
*/
function removeByValue(array, value){
    return array.filter(function(elem, _index){
        return value != elem;
    });
}
l = [1,3,4,5,6,7];
console.log(removeByValue(l, 5));

$> [ 1, 3, 4, 6, 7]
13
nsantana

Tôi muốn trả lời dựa trênES6. Giả sử, bạn có một mảng như dưới đây:

let arr = [1,2,3,4];

Nếu bạn muốn xóa chỉ mục đặc biệt như 2, hãy viết mã bên dưới:

arr.splice(2, 1); //=> arr became [1,2,4]

Nhưng nếu bạn muốn xóa một mục đặc biệt như 3 và bạn không biết chỉ mục của nó sẽ như thế nào dưới đây:

arr = arr.filter(e => e !== 3); //=> arr became [1,2,4]

Gợi ý : vui lòng sử dụng chức năng mũi tên để gọi lại bộ lọc trừ khi bạn sẽ nhận được một mảng trống.

11
AmerllicA

Tạo mảng mới:

var my_array = new Array();

Thêm các phần tử vào mảng này:

my_array.Push("element1");

Hàm indexOf (Trả về chỉ mục hoặc -1 khi không tìm thấy):

var indexOf = function(needle) 
{
    if(typeof Array.prototype.indexOf === 'function') // newer browsers
    {
        indexOf = Array.prototype.indexOf;
    } 
    else // older browsers
    {
        indexOf = function(needle) 
        {
            var index = -1;

            for(var i = 0; i < this.length; i++) 
            {
                if(this[i] === needle) 
                {
                    index = i;
                    break;
                }
            }
            return index;
        };
    }

    return indexOf.call(this, needle);
};

Kiểm tra chỉ mục của phần tử này (được thử nghiệm với firefox và IE8 +):

var index = indexOf.call(my_array, "element1");

Xóa 1 phần tử nằm ở chỉ mục khỏi mảng

my_array.splice(index, 1);
11
Enrico

Tôi cũng đã chạy trong tình huống phải xóa một phần tử khỏi Array. .indexOf không hoạt động trong IE* nên chia sẻ giải pháp jQuery.inArray() đang hoạt động của tôi.

var index = jQuery.inArray(val,arr);
if (index > -1) {
    arr.splice(index, 1);
    //console.log(arr);
}
10
NullPointer

2017-05-08

Hầu hết các câu trả lời được đưa ra để so sánh chặt chẽ, có nghĩa là cả hai đối tượng đều tham chiếu cùng một đối tượng chính xác trong bộ nhớ (hoặc là các kiểu nguyên thủy), nhưng thường bạn muốn xóa một đối tượng không nguyên thủy khỏi một mảng có giá trị nhất định. Chẳng hạn, nếu bạn thực hiện cuộc gọi đến máy chủ và muốn kiểm tra một đối tượng được truy xuất đối với một đối tượng cục bộ.

const a = {'field': 2} // Non-primitive object
const b = {'field': 2} // Non-primitive object with same value
const c = a            // Non-primitive object that reference the same object as "a"

assert(a !== b) // Don't reference the same item, but have same value
assert(a === c) // Do reference the same item, and have same value (naturally)

//Note: there are many alternative implementations for valuesAreEqual
function valuesAreEqual (x, y) {
   return  JSON.stringify(x) === JSON.stringify(y)
}


//filter will delete false values
//Thus, we want to return "false" if the item
// we want to delete is equal to the item in the array
function removeFromArray(arr, toDelete){
    return arr.filter(target => {return !valuesAreEqual(toDelete, target)})
}

const exampleArray = [a, b, b, c, a, {'field': 2}, {'field': 90}];
const resultArray = removeFromArray(exampleArray, a);

//resultArray = [{'field':90}]

Có các triển khai thay thế/nhanh hơn cho các giá trịAreEqual, nhưng điều này thực hiện công việc. Bạn cũng có thể sử dụng một bộ so sánh tùy chỉnh nếu bạn có một trường cụ thể để kiểm tra (ví dụ: một số UUID được truy xuất so với UUID cục bộ).

Cũng lưu ý rằng đây là một hoạt động chức năng, có nghĩa là nó không làm thay đổi mảng ban đầu.

9
Aidan Hoolachan

Tôi nghĩ rằng nhiều hướng dẫn JavaScript không được nghĩ ra cho lập trình chức năng. Splice trả về phần tử bị xóa trong đó hầu hết thời gian bạn cần mảng giảm. Thật tệ.

Hãy tưởng tượng bạn đang thực hiện một cuộc gọi đệ quy và phải vượt qua một mảng với một mục ít hơn, có thể không có mục được lập chỉ mục hiện tại. Hoặc tưởng tượng bạn đang thực hiện một cuộc gọi đệ quy khác và phải vượt qua một mảng với một phần tử được đẩy.

Trong cả hai trường hợp này, bạn không thể làm myRecursiveFunction(myArr.Push(c)) hoặc myRecursiveFunction(myArr.splice(i,1)). Thực tế, kẻ ngốc thứ nhất sẽ vượt qua độ dài của mảng và kẻ ngốc thứ hai sẽ vượt qua phần tử bị xóa dưới dạng tham số.

Vì vậy, những gì tôi làm trong thực tế ... Để xóa một phần tử mảng và chuyển kết quả cho một hàm làm tham số đồng thời tôi làm như sau

myRecursiveFunction(myArr.slice(0,i).concat(a.slice(i+1)))

Khi nói đến Push điều đó ngớ ngẩn hơn ... tôi thích,

myRecursiveFunction((myArr.Push(c),myArr))

Tôi tin vào một ngôn ngữ chức năng phù hợp, một phương thức làm biến đổi đối tượng mà nó được yêu cầu phải trả lại một tham chiếu đến chính đối tượng đó.

9
Redu

Trong CoffeeScript :

my_array.splice(idx, 1) for ele, idx in my_array when ele is this_value
8
Nigel Sheridan-Smith

Sử dụng InArray của jQuery:

A = [1, 2, 3, 4, 5, 6];
A.splice($.inArray(3, A), 1);
//It will return A=[1, 2, 4, 5, 6]`   

Lưu ý: inArray sẽ trả về -1, nếu không tìm thấy phần tử.

7
Do Hoa Vinh

JavaScript Vanilla (ES5.1) - tại chỗ phiên bản

Hỗ trợ trình duyệt: Internet Explorer 9 hoặc mới hơn ( hỗ trợ trình duyệt chi tiết )

/**
 * Removes all occurences of the item from the array.
 *
 * Modifies the array “in place”, i.e. the array passed as an argument
 * is modified as opposed to creating a new array. Also returns the modified
 * array for your convenience.
 */
function removeInPlace(array, item) {
    var foundIndex, fromIndex;

    // Look for the item (the item can have multiple indices)
    fromIndex = array.length - 1;
    foundIndex = array.lastIndexOf(item, fromIndex);

    while (foundIndex !== -1) {
        // Remove the item (in place)
        array.splice(foundIndex, 1);

        // Bookkeeping
        fromIndex = foundIndex - 1;
        foundIndex = array.lastIndexOf(item, fromIndex);
    }

    // Return the modified array
    return array;
}

Vanilla JavaScript (ES5.1) - không thay đổi phiên bản

Hỗ trợ trình duyệt: Tương tự Vanilla JavaScript trong phiên bản địa điểm

/**
 * Removes all occurences of the item from the array.
 *
 * Returns a new array with all the items of the original array except
 * the specified item.
 */
function remove(array, item) {
    var arrayCopy;

    arrayCopy = array.slice();

    return removeInPlace(arrayCopy, item);
}

Vanilla ES6 - không thay đổi phiên bản

Hỗ trợ trình duyệt: Chrome 46, Edge 12, Firefox 16, Opera 37, Safari 8 ( hỗ trợ trình duyệt chi tiết )

/**
 * Removes all occurences of the item from the array.
 *
 * Returns a new array with all the items of the original array except
 * the specified item.
 */
function remove(array, item) {
    // Copy the array
    array = [...array];

    // Look for the item (the item can have multiple indices)
    let fromIndex = array.length - 1;
    let foundIndex = array.lastIndexOf(item, fromIndex);

    while (foundIndex !== -1) {
        // Remove the item by generating a new array without it
        array = [
            ...array.slice(0, foundIndex),
            ...array.slice(foundIndex + 1),
        ];

        // Bookkeeping
        fromIndex = foundIndex - 1;
        foundIndex = array.lastIndexOf(item, fromIndex)
    }

    // Return the new array
    return array;
}
6

Xóa phần tử tại chỉ mục i, mà không làm thay đổi mảng ban đầu:

/**
* removeElement
* @param {Array} array
* @param {Number} index
*/
function removeElement(array, index) {
   return Array.from(array).splice(index, 1);
}

// Another way is
function removeElement(array, index) {
   return array.slice(0).splice(index, 1);
}
6
alejandro

Tôi thích phiên bản mối nối này, loại bỏ một phần tử theo giá trị của nó bằng cách sử dụng $.inArray:

$(document).ready(function(){
    var arr = ["C#","Ruby","PHP","C","C++"];
    var itemtoRemove = "PHP";
    arr.splice($.inArray(itemtoRemove, arr),1);
});
6
mboeckle

Bạn có thể lặp lại qua từng mục array- và splice nếu nó tồn tại trong array của bạn.

function destroy(arr, val) {
    for (var i = 0; i < arr.length; i++) if (arr[i] === val) arr.splice(i, 1);
    return arr;
}
6
yckart

Tôi vừa tạo một polyfill trên Array.prototype qua Object.defineProperty để xóa phần tử mong muốn trong một mảng mà không dẫn đến lỗi khi lặp qua nó sau for .. in ..

if (!Array.prototype.remove) {
  // Object.definedProperty is used here to avoid problems when iterating with "for .. in .." in Arrays
  // https://stackoverflow.com/questions/948358/adding-custom-functions-into-array-prototype
  Object.defineProperty(Array.prototype, 'remove', {
    value: function () {
      if (this == null) {
        throw new TypeError('Array.prototype.remove called on null or undefined')
      }

      for (var i = 0; i < arguments.length; i++) {
        if (typeof arguments[i] === 'object') {
          if (Object.keys(arguments[i]).length > 1) {
            throw new Error('This method does not support more than one key:value pair per object on the arguments')
          }
          var keyToCompare = Object.keys(arguments[i])[0]

          for (var j = 0; j < this.length; j++) {
            if (this[j][keyToCompare] === arguments[i][keyToCompare]) {
              this.splice(j, 1)
              break
            }
          }
        } else {
          var index = this.indexOf(arguments[i])
          if (index !== -1) {
            this.splice(index, 1)
          }
        }
      }
      return this
    }
  })
} else {
  var errorMessage = 'DANGER ALERT! Array.prototype.remove has already been defined on this browser. '
  errorMessage += 'This may lead to unwanted results when remove() is executed.'
  console.log(errorMessage)
}

Xóa một giá trị số nguyên

var a = [1, 2, 3]
a.remove(2)
a // Output => [1, 3]

Xóa giá trị chuỗi

var a = ['a', 'ab', 'abc']
a.remove('abc')
a // Output => ['a', 'ab']

Xóa giá trị boolean

var a = [true, false, true]
a.remove(false)
a // Output => [true, true]

Cũng có thể xóa một đối tượng bên trong mảng thông qua phương thức Array.prototype.remove này. Bạn chỉ cần chỉ định key => value của Object bạn muốn xóa.

Xóa một giá trị đối tượng

var a = [{a: 1, b: 2}, {a: 2, b: 2}, {a: 3, b: 2}]
a.remove({a: 1})
a // Output => [{a: 2, b: 2}, {a: 3, b: 2}]
5
Victor

Tôi đã thực hiện một phần mở rộng khá hiệu quả cho mảng JavaScript cơ sở:

Array.prototype.drop = function(k) {
  var valueIndex = this.indexOf(k);
  while(valueIndex > -1) {
    this.removeAt(valueIndex);
    valueIndex = this.indexOf(k);
  }
};
5
Shawn Deprey

Theo giải pháp của tôi, bạn có thể xóa một hoặc nhiều mục trong một mảng nhờ JavaScript thuần túy. Không cần cho một thư viện JavaScript khác.

var myArray = [1,2,3,4,5]; // First array

var removeItem = function(array,value) {  // My clear function
    if(Array.isArray(value)) {  // For multi remove
        for(var i = array.length - 1; i >= 0; i--) {
            for(var j = value.length - 1; j >= 0; j--) {
                if(array[i] === value[j]) {
                    array.splice(i, 1);
                };
            }
        }
    }
    else { // For single remove
        for(var i = array.length - 1; i >= 0; i--) {
            if(array[i] === value) {
                array.splice(i, 1);
            }
        }
    }
}

removeItem(myArray,[1,4]); // myArray will be [2,3,5]
5
Kamuran Sönecek

Xóa một giá trị, sử dụng so sánh lỏng lẻo, mà không làm thay đổi mảng gốc, ES6

/**
 * Removes one instance of `value` from `array`, without mutating the original array. Uses loose comparison.
 * 
 * @param {Array} array Array to remove value from
 * @param {*} value Value to remove
 * @returns {Array} Array with `value` removed
 */
export function arrayRemove(array, value) {
    for(let i=0; i<array.length; ++i) {
        if(array[i] == value) {
            let copy = [...array];
            copy.splice(i, 1);
            return copy;
        }
    }
    return array;
}
4
mpen

Mặc dù hầu hết các câu trả lời ở trên trả lời câu hỏi, nhưng vẫn chưa rõ tại sao phương thức slice() không được sử dụng. Có, filter() đáp ứng các tiêu chí bất biến, nhưng làm thế nào để thực hiện tương đương ngắn hơn sau đây:

const myArray = [1,2,3,4];

Và bây giờ hãy nói rằng chúng ta nên loại bỏ phần tử thứ hai khỏi mảng, chúng ta chỉ cần làm: const newArray = myArray.slice(0,1).concat(myArray.slice(2,4));// [1,3,4]

Cách xóa một phần tử khỏi một mảng được khuyến khích mạnh mẽ ngày nay trong cộng đồng do tính chất đơn giản và bất biến của nó. Nói chung, nên tránh các phương pháp gây đột biến. Ví dụ: bạn được khuyến khích thay thế Push() bằng concat()splice() bằng slice() 

4
Stelios Voskos

Sử dụng jQuery.grep () :

var y = [1, 2, 3, 9, 4]
var removeItem = 9;

y = jQuery.grep(y, function(value) {
  return value != removeItem;
});
console.log(y)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script>

4
Mahendra Kulkarni

Việc xóa một phần tử/chuỗi cụ thể khỏi một mảng có thể được thực hiện trong một lớp lót: Tôi vẫn nghĩ rằng đây là lớp lót thanh lịch nhất mà bạn có thể nhận được cho loại vấn đề này: 

theArray.splice(theArray.indexOf("stringToRemoveFromArray"), 1);

trong đó 'theArray' là mảng bạn muốn xóa thứ gì đó cụ thể khỏi.

4
Max Alexander Hanna

Gửi mã của tôi loại bỏ một phần tử mảng tại chỗ và cũng giảm độ dài của mảng.

function removeElement(idx, arr) {
    // check the index value
    if (idx < 0 || idx >= arr.length) {
        return;
    }
    // shift the elements
    for (var i = idx; i > 0; --i) {
        arr[i] = arr[i - 1];
    }
    // remove the first element in array
    arr.shift();
}
3
hailong

Có nhiều câu trả lời tuyệt vời ở đây, nhưng đối với tôi, điều làm việc đơn giản nhất là không loại bỏ hoàn toàn phần tử của tôi khỏi mảng mà chỉ đơn giản là đặt giá trị của nó thành null. Điều này hoạt động cho hầu hết các trường hợp tôi có, và là một giải pháp tốt vì tôi sẽ sử dụng biến sau này và không muốn nó biến mất, bây giờ chỉ để trống. Ngoài ra, phương pháp này hoàn toàn tương thích với nhiều trình duyệt.

array.key = null;
3
rncrtr

Loại bỏ sự xuất hiện cuối cùng hoặc tất cả các lần xuất hiện, hoặc lần xuất hiện đầu tiên? 

var array = [2, 5, 9, 5];

// Remove last occurrence (or all occurrences)
for (var i = array.length; i--;) {
  if (array[i] === 5) {
     array.splice(i, 1);
     break; // Remove this line to remove all occurrences
  }
}

hoặc là

var array = [2, 5, 9, 5];

// Remove first occurrence
for (var i = 0; array.length; i++) {
  if (array[i] === 5) {
     array.splice(i, 1);
     break; // Do not remove this line
  }
}
3
MEC

Đối với bất kỳ ai đang tìm cách sao chép một phương thức sẽ trả về một mảng mới đã loại bỏ các số hoặc chuỗi trùng lặp, điều này đã được kết hợp từ các câu trả lời hiện có:

function uniq(array) {
  var len = array.length;
  var dupFree = [];
  var tempObj = {};

  for (var i = 0; i < len; i++) {
    tempObj[array[i]] = 0;
  }

  console.log(tempObj);

  for (var i in tempObj) {
    var element = i;
    if (i.match(/\d/)) {
      element = Number(i);
    }
    dupFree.Push(element);
  }

  return dupFree;
}
3
cjjenkinson

Tôi đã thực hiện một chức năng 

function pop(valuetoremove, myarray) {
var indexofmyvalue = myarray.indexOf(valuetoremove);
myarray.splice(indexofmyvalue, 1);
}

Và được sử dụng như thế này.

pop(valuetoremove,myarray);

Chúc mừng!

3
Ali Akram

Việc thực hiện rất ngây thơ sẽ như sau:

Array.prototype.remove = function(data) {
    const dataIdx = this.indexOf(data)
    if(dataIdx >= 0) {
        this.splice(dataIdx ,1);
    }
    return this.length;
}

let a = [1,2,3];
// this will change arr a to [1, 3]
a.remove(2);

Tôi trả về độ dài của mảng từ hàm để tuân thủ các phương thức khác như Array.prototype.Push().

3
Gaurang Patel

Tôi đã có vấn đề này bản thân mình (trong tình huống thay thế mảng là chấp nhận được) và giải quyết nó đơn giản:

var filteredItems = this.items.filter(function (i) {
    return i !== item;
});

Để cung cấp cho đoạn trích trên một chút bối cảnh:

self.thingWithItems = {
        items: [],
        removeItem: function (item) {
            var filteredItems = this.items.filter(function (i) {
                return i !== item;
            });

            this.items = filteredItems;
        }
    };

Giải pháp này nên làm việc với cả các mục tham khảo và giá trị. Tất cả phụ thuộc vào việc bạn có cần duy trì một tham chiếu đến mảng ban đầu hay không để xem giải pháp này có được áp dụng hay không. 

2
Phil

Một câu trả lời khác, với tôi đơn giản hơn là tốt hơn, và như chúng ta đang ở trong năm 2018 (gần năm 2019) tôi đưa cho bạn cái này (gần) một lớp lót để trả lời câu hỏi ban đầu:

Array.prototype.remove = function (value) { 
    return this.filter(f => f != value) 
}

Điều hữu ích là bạn có thể sử dụng nó trong một biểu thức cà ri như:

[1,2,3].remove(2).sort()

2
Sebastien H.
var array = [2, 5, 9];
array.splice(array.findIndex(x => x==5), 1);

Sử dụng Array.findindex, chúng ta có thể giảm số lượng dòng mã.

developer.mozilla.org

2
sujithklr93
var index,
    input = [1,2,3],
    indexToRemove = 1;
    integers = [];

for (index in input) {
    if (input.hasOwnProperty(index)) {
        if (index !== indexToRemove) {
            integers.Push(result); 
        }
    }
}
input = integers;

Giải pháp này sẽ lấy một mảng đầu vào và sẽ tìm kiếm thông qua đầu vào để loại bỏ giá trị. Điều này sẽ lặp qua toàn bộ mảng đầu vào và kết quả sẽ là một số nguyên mảng thứ hai đã loại bỏ chỉ mục cụ thể. Mảng số nguyên sau đó được sao chép lại vào mảng đầu vào. 

2
penguin

Câu hỏi của bạn không cho biết thứ tự hoặc giá trị khác biệt là một yêu cầu.

Nếu bạn không quan tâm đến đơn hàng và sẽ không có cùng một giá trị trong vùng chứa nhiều lần, hãy sử dụng Bộ. Nó sẽ là cách nhanh hơn, và cô đọng hơn. 

var aSet = new Set();

aSet.add(1);
aSet.add(2);
aSet.add(3);

aSet.delete(2);
2
Steven Spungin
[2,3,5].filter(i => ![5].includes(i))
2

Loại bỏ giá trị với chỉ mục và mối nối!

function removeArrValue(arr,value) {
    var index = arr.indexOf(value);
    if (index > -1) {
        arr.splice(index, 1);
    }
    return arr;
}
2
Nejc Lepen

xóa phần tử từ cuối 

arrName.pop();

xóa phần tử từ đầu tiên 

arrName.shift();

xóa từ giữa

arrName.splice(starting index,number of element you wnt to delete);

Ex: arrName.splice(1,1);

xóa một yếu tố cuối cùng

arrName.splice(-1);

Xóa bằng cách sử dụng số chỉ mục mảng

 delete arrName[1];
2
Srikrushna Pal

Thật đáng tiếc khi bạn có một mảng các số nguyên, không phải là một đối tượng trong đó các khóa là các chuỗi tương đương của các số nguyên này.

Tôi đã xem qua rất nhiều câu trả lời này và tất cả chúng dường như sử dụng "sức mạnh vũ phu" theo như tôi có thể thấy. Tôi đã không kiểm tra từng người một, xin lỗi nếu điều này không phải như vậy. Đối với một mảng nhỏ thì điều này là tốt, nhưng nếu bạn có 000 số nguyên trong đó thì sao?

Sửa lỗi cho tôi nếu tôi sai, nhưng chúng ta không thể cho rằng trong bản đồ key => value, thuộc loại đối tượng JS, cơ chế truy xuất khóa có thể được coi là được thiết kế và tối ưu hóa cao không? (NB nếu một số siêu chuyên gia nói với tôi rằng đây không phải là trường hợp, tôi có thể đề xuất sử dụng ES6's Lớp bản đồ thay vào đó, chắc chắn sẽ như vậy).

Tôi chỉ đề xuất rằng, trong một số trường hợp nhất định, giải pháp tốt nhất có thể là chuyển đổi mảng của bạn thành một đối tượng ... tất nhiên, vấn đề là bạn có thể lặp lại các giá trị nguyên. Tôi khuyên bạn nên đặt những thứ đó trong các thùng làm phần "giá trị" của các mục key => value. (NB nếu bạn chắc chắn rằng bạn không có bất kỳ thành phần mảng lặp lại nào, việc này có thể đơn giản hơn nhiều: các giá trị "giống như" và chỉ cần đi Object.values(...) để lấy lại mảng đã sửa đổi của bạn).

Vì vậy, bạn có thể làm:

const arr = [ 1, 2, 55, 3, 2, 4, 55 ];
const f =   function( acc, val, currIndex ){ 
    // not seen this val before: make bucket... NB although val's typeof is 'number'
    // there is seamless equivalence between the object key (always string)
    // and this variable val 
    ! ( val in acc ) ? acc[ val ] = []: 0;
    // drop another array index in the bucket
    acc[ val ].Push( currIndex );
    return acc; 
}
const myIntsMapObj = arr.reduce( f, {});

console.log( myIntsMapObj );

đầu ra:

Đối tượng [<1 khe trống>, Mảng 1 , Mảng [2], Mảng 1 , Mảng 1 , <5 các ô trống>, thêm 46 điểm]

sau đó dễ dàng xóa tất cả các số 55

delete myIntsMapObj[ 55 ]; // again, although keys are strings this works

Bạn không phải xóa tất cả: các giá trị chỉ mục được đẩy vào các thùng của chúng theo thứ tự xuất hiện, vì vậy (ví dụ):

myIntsMapObj[ 55 ].shift(); // and
myIntsMapObj[ 55 ].pop(); 

sẽ xóa lần xuất hiện đầu tiên và cuối cùng. Bạn có thể dễ dàng đếm tần suất xuất hiện, thay thế tất cả 55 giây bằng 3 giây bằng cách chuyển nội dung của thùng này sang thùng khác, v.v.

... lấy lại mảng int đã sửa đổi của bạn có liên quan một chút: nhưng mỗi nhóm chứa chỉ mục (trong mảng ban đầu) của giá trị được biểu thị bằng phím (chuỗi). Mỗi giá trị trong nhóm này cũng là duy nhất: vì vậy bạn biến chúng thành các khóa trong một đối tượng mới, với số nguyên (thực) từ "khóa chuỗi số nguyên" làm giá trị ... sau đó sắp xếp các khóa và đi Object.values( ... ).

Điều này nghe có vẻ rất liên quan và tốn thời gian ... nhưng rõ ràng mọi thứ phụ thuộc vào hoàn cảnh và cách sử dụng mong muốn. Tôi hiểu rằng tất cả các phiên bản và bối cảnh của JS chỉ hoạt động trong một luồng và luồng không "buông", do đó, có thể có một số tắc nghẽn khủng khiếp với phương thức "brute force": gây ra không nhiều bởi indexOf ops , nhưng nhiều lần lặp lại slicesplice ops.

_/Phụ lục
Nếu bạn chắc chắn đây là quá nhiều kỹ thuật cho trường hợp sử dụng của bạn, chắc chắn cách tiếp cận "vũ phu" đơn giản nhất là

const arr = [ 1, 2, 3, 66, 8, 2, 3, 2 ];
const newArray = arr.filter( number => number !== 3 );
console.log( newArray )

(vâng, các câu trả lời khác đã phát hiện Array.prototype.filter...)

2
mike rodent

Phương thức sau đây sẽ xóa tất cả các mục nhập của một giá trị đã cho khỏi một mảng mà không tạo ra một mảng mới và chỉ với một lần lặp đó là superfast. Và nó hoạt động trong trình duyệt Internet Explorer 5.5 cổ đại:

function removeFromArray(arr, removeValue) {
  for (var i = 0, k = 0, len = arr.length >>> 0; i < len; i++) {
    if (k > 0)
      arr[i - k] = arr[i];

    if (arr[i] === removeValue)
      k++;
  }

  for (; k--;)
    arr.pop();
}

var a = [0, 1, 0, 2, 0, 3];

document.getElementById('code').innerHTML =
  'Initial array [' + a.join(', ') + ']';
//Initial array [0, 1, 0, 2, 0, 3]

removeFromArray(a, 0);

document.getElementById('code').innerHTML +=
  '<br>Resulting array [' + a.join(', ') + ']';
//Resulting array [1, 2, 3]
<code id="code"></code>

2
Eugene Tiurin

Để xóa phần tử cụ thể hoặc các phần tử tiếp theo, Array.splice () phương thức hoạt động tốt . Phương thức splice () thay đổi nội dung của một mảng bằng cách xóa hoặc thay thế các phần tử hiện có và/hoặc thêm phần tử mới và nó trả về các mục bị loại bỏ.

Cú pháp: _ ​​mảng.splice (index, xóaCount, item1, ....., itemX)

Ở đây index là bắt buộc và các đối số nghỉ là tùy chọn.

Ví dụ:

let arr = [1, 2, 3, 4, 5, 6];
arr.splice(2,1);
console.log(arr);
// [1, 2, 4, 5, 6]

Lưu ý:Array.splice () có thể được sử dụng nếu bạn biết chỉ mục của phần tử mà bạn muốn xóa. Nhưng chúng ta có thể có thêm một vài trường hợp như được đề cập dưới đây-

  1. Trong trường hợp bạn muốn xóa chỉ phần tử cuối cùng, bạn có thể sử dụng Array.pop ()

  2. Trong trường hợp bạn muốn xóa chỉ phần tử đầu tiên, bạn có thể sử dụng Array.shift ()

  3. Nếu bạn biết phần tử một mình nhưng không biết vị trí (hoặc chỉ mục) của phần tử và muốn xóa tất cả các phần tử phù hợp bằng cách sử dụng Array.filter () :

    let arr = [1, 2, 1, 3, 4, 1, 5, 1];
    
    let newArr = arr.filter(function(val){
        return val !== 1;
     });
     //newArr => [2, 3, 4, 5]
    

HOẶC bằng cách sử dụng phương thức splice () như-

let arr = [1, 11, 2, 11, 3, 4, 5, 11, 6, 11];
    for( let i = 0; i < arr.length-1; i++){
       if ( arr[i] === 11) {
         arr.splice(i, 1); 
       }
    }
    console.log(arr);
    // [1, 2, 3, 4, 5, 6]

HOẶC Giả sử chúng tôi muốn xóa del khỏi mảng Array:

let arr = [1, 2, 3, 4, 5, 6];
let del = 4;
if(arr.indexOf(4) >= 0) {
arr.splice(arr.indexOf(4), 1)
}

OR

let del = 4;
for(var i = arr.length - 1; i >= 0; i--) {
    if(arr[i] === del) {
       arr.splice(i, 1);
    }
}
  1. Nếu bạn chỉ biết phần tử mà không biết vị trí (hoặc chỉ mục) của phần tử và muốn xóa phần tử khớp đầu tiên bằng phương thức splice ():

    let arr = [1, 11, 2, 11, 3, 4, 5, 11, 6, 11];
    
    for( let i = 0; i < arr.length-1; i++){
      if ( arr[i] === 11) {
        arr.splice(i, 1);
        break;
      }
    }
    console.log(arr);
    // [1, 11, 2, 11, 3, 4, 5, 11, 6, 11]
    
1
Chang

Nếu bạn phải hỗ trợ các phiên bản Internet Explorer cũ hơn, tôi khuyên bạn nên sử dụng polyfill sau (lưu ý: đây là không một khung). Đây là sự thay thế tương thích ngược 100% với tất cả các phương thức mảng hiện đại (JavaScript 1.8.5/ECMAScript 5 Array Extras) hoạt động cho Internet Explorer 6+, Firefox 1.5+, Chrome, Safari và Opera.

https://github.com/plusdude/array-generics

1
Matt Brock

Thông thường, tốt hơn là chỉ tạo một mảng mới với chức năng lọc.

const array = [1,2,3,4];
array = array.filter(i => i !== 4); // [1,2,3]

Điều này cũng cải thiện khả năng đọc imho. Tôi không phải là một fan hâm mộ của lát, mặc dù nó biết đôi khi bạn nên đi cho nó.

1
codepleb

Xác định một phương thức có tên remove () trên các đối tượng mảng bằng tính năng bảo vệ của JavaScript.

Sử dụng phương thức splice () để đáp ứng yêu cầu của bạn.

Xin vui lòng xem mã dưới đây.

Array.prototype.remove = function(item) {
    // index will have -1 if item does not exist
    // else it will have the index of 1st item found in array
    var index = this.indexOf(item); 

    if (index > -1) {
        // splice() method is used to add/remove items(s) in array
        this.splice(index, 1); 
    }

    return index;
}


var arr = [ 11, 22, 67, 45, 61, 89, 34, 12, 7, 8, 3, -1, -4];

// Printing array
// [ 11, 22, 67, 45, 61, 89, 34, 12, 7, 8, 3, -1, -4];
console.log(arr)

// Removing 67 (getting its index i.e. 2)
console.log("Removing 67")
var index = arr.remove(67)

if (index > 0){
    console.log("Item 67 found at ", index)
} else {
    console.log("Item 67 does not exist in array")
}

// Printing updated array
// [ 11, 22, 45, 61, 89, 34, 12, 7, 8, 3, -1, -4];
console.log(arr)

// ............... Output ................................
// [ 11, 22, 67, 45, 61, 89, 34, 12, 7, 8, 3, -1, -4 ]
// Removing 67
// Item 67 found at  2
// [ 11, 22, 45, 61, 89, 34, 12, 7, 8, 3, -1, -4 ]

Lưu ý: Dưới đây là mã ví dụ đầy đủ được thực thi trên Node.js REPL mô tả việc sử dụng Push (), pop (), shift (), unshift () và splice () phương thức.

> // Defining an array
undefined
> var arr = [12, 45, 67, 89, 34, 12, 7, 8, 3, -1, -4, -11, 0, 56, 12, 34];
undefined
> // Getting length of array
undefined
> arr.length;
16
> // Adding 1 more item at the end i.e. pushing an item
undefined
> arr.Push(55);
17
> arr
[ 12, 45, 67, 89, 34, 12, 7, 8, 3, -1, -4, -11, 0, 56, 12, 34, 55 ]
> // Popping item from array (i.e. from end)
undefined
> arr.pop()
55
> arr
[ 12, 45, 67, 89, 34, 12, 7, 8, 3, -1, -4, -11, 0, 56, 12, 34 ]
> // Remove item from beginning
undefined
> arr.shift()
12
> arr
[ 45, 67, 89, 34, 12, 7, 8, 3, -1, -4, -11, 0, 56, 12, 34 ]
> // Add item(s) at beginning
undefined
> arr.unshift(67); // Add 67 at begining of the array and return number of items in updated/new array
16
> arr
[ 67, 45, 67, 89, 34, 12, 7, 8, 3, -1, -4, -11, 0, 56, 12, 34 ]
> arr.unshift(11, 22); // Adding 2 more items at the beginning of array
18
> arr
[ 11, 22, 67, 45, 67, 89, 34, 12, 7, 8, 3, -1, -4, -11, 0, 56, 12, 34 ]
>
> // Define a method on array (temorarily) to remove an item and return the index of removed item; if it is found else return -1
undefined
> Array.prototype.remove = function(item) {
... var index = this.indexOf(item);
... if (index > -1) {
..... this.splice(index, 1); // splice() method is used to add/remove items in array
..... }
... return index;
... }
[Function]
>
> arr
[ 11, 22, 67, 45, 67, 89, 34, 12, 7, 8, 3, -1, -4, -11, 0, 56, 12, 34 ]
>
> arr.remove(45);   // Remove 45 (You will get the index of removed item)
3
> arr
[ 11, 22, 67, 67, 89, 34, 12, 7, 8, 3, -1, -4, -11, 0, 56, 12, 34 ]
>
> arr.remove(22)    // Remove 22
1
> arr
[ 11, 67, 67, 89, 34, 12, 7, 8, 3, -1, -4, -11, 0, 56, 12, 34 ]
> arr.remove(67)    // Remove 67
1
> arr
[ 11, 67, 89, 34, 12, 7, 8, 3, -1, -4, -11, 0, 56, 12, 34 ]
>
> arr.remove(89)    // Remove 89
2
> arr
[ 11, 67, 34, 12, 7, 8, 3, -1, -4, -11, 0, 56, 12, 34 ]
>
> arr.remove(100);  // 100 doesn't exist, remove() will return -1
-1
>

Cảm ơn.

1
hygull

Ghép, lọc và xóa để xóa phần tử khỏi mảng

Mỗi mảng có chỉ mục của chúng và nó giúp xóa phần tử cụ thể với chỉ mục của chúng.

Phương thức splice () 

mảng.splice (index, 1 ); Tham số thứ nhất là chỉ số và thứ hai là số phần tử bạn

muốn xóa khỏi chỉ mục đó.

Vì vậy, đối với phần tử đơn, chúng tôi sử dụng 1. 

Phương thức xóa

xóa mảng [index]

Phương thức lọc ()

Nếu bạn muốn xóa phần tử được lặp lại trong mảng thì hãy lọc mảng.

remove ALL = mảng.filter (e => e! = elem);

trong đó elem là phần tử bạn muốn loại bỏ khỏi mảng và mảng là tên mảng của bạn

1
ashish

Phương thức splice () thay đổi nội dung của một mảng bằng cách loại bỏ hoặc thay thế các phần tử hiện có và/hoặc thêm các phần tử mới.

mảng.splice (bắt đầu [ xóaCount [ item1 [ item2 [ ...]]]])

khởi đầu

Chỉ mục để bắt đầu thay đổi mảng (với Origin 0). Nếu lớn hơn chiều dài của mảng, chỉ số bắt đầu thực tế sẽ được đặt thành chiều dài của mảng. Nếu âm, sẽ bắt đầu có nhiều phần tử từ cuối mảng (với Origin -1) và sẽ được đặt thành 0 nếu giá trị tuyệt đối lớn hơn độ dài của mảng.

xóaCount Tùy chọn

Một số nguyên chỉ số lượng phần tử mảng cũ cần xóa . Nếu xóaCount bị bỏ qua hoặc nếu giá trị của nó lớn hơn mảng.length - start (nghĩa là, nếu nó lớn hơn số phần tử còn lại trong mảng, bắt đầu từ lúc bắt đầu), sau đó tất cả các phần tử từ đầu đến cuối mảng sẽ bị xóa . Nếu xóaCount là 0 hoặc âm, không có phần tử nào bị xóa. Trong trường hợp này, bạn nên chỉ định ít nhất một yếu tố mới (xem bên dưới).

item1, item2, ... Tùy chọn

Các yếu tố để thêm vào mảng, bắt đầu tại chỉ mục bắt đầu. Nếu bạn không chỉ định bất kỳ phần tử nào, splice () sẽ chỉ xóa các phần tử khỏi mảng.

Để biết thêm thông tin, vui lòng xem qua:

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

0
ashish

Đã có rất nhiều câu trả lời, nhưng vì chưa có ai thực hiện nó với một lớp lót, tôi nghĩ rằng tôi đã trình bày phương pháp của mình. Nó lợi dụng thực tế là hàm string.split () sẽ loại bỏ tất cả các ký tự được chỉ định khi tạo một mảng. Đây là một ví dụ: 

var ary = [1,2,3,4,1234,10,4,5,7,3];
out = ary.join("-").split("-4-").join("-").split("-");
console.log(out);

Trong ví dụ này, tất cả 4 cái đang bị xóa khỏi mảng ary. Tuy nhiên, điều quan trọng cần lưu ý là bất kỳ mảng nào chứa ký tự "-" sẽ gây ra sự cố với ví dụ này. Nói tóm lại, nó sẽ khiến hàm jo ("-") ghép chuỗi của bạn không đúng cách. Trong tình huống như vậy, tất cả các chuỗi "-" trong đoạn trích trên có thể được thay thế bằng bất kỳ chuỗi nào sẽ không được sử dụng trong mảng ban đầu. Đây là một ví dụ khác: 

var ary = [1,2,3,4,'-',1234,10,'-',4,5,7,3];
out = ary.join("[email protected]#").split("[email protected]#[email protected]#").join("[email protected]#").split("[email protected]#");
console.log(out);

0
Partial Science

Giải pháp không tại chỗ

arr.slice(0,i).concat(arr.slice(i+1));
let arr = [10, 20, 30, 40, 50]

let i = 2 ; // position to remove (starting from 0)
let r = arr.slice(0,i).concat(arr.slice(i+1));

console.log(r);
0
Kamil Kiełczewski

bạn có thể mở rộng đối tượng mảng để xác định chức năng xóa tùy chỉnh như sau

let numbers = [1,2,4,4,5,3,45,9];

numbers.delete = function(value){
    var indexOfTarget = this.indexOf(value)

    if(indexOfTarget !== -1)
    {
        console.log("array before delete " + this)
        this.splice(indexOfTarget, 1)
        console.log("array after delete " + this)
    }else{
        console.error("element " + value + " not found")
    }
}
numbers.delete(888)
//expected output:
//element 888 not found
numbers.delete(1)

//expected output;
//array before delete 1,2,4,4,5,3,45,9
//array after delete 2,4,4,5,3,45,9

Tôi hy vọng điều đó sẽ giúp

0
mekbib.awoke

Lấy lợi nhuận của phương pháp giảm như sau:

trường hợp a) nếu bạn cần loại bỏ phần tử theo chỉ mục:

function remove(arr, index) {
  return arr.reduce((prev, x, i) => prev.concat(i !== index ? [x] : []), []);
}

trường hợp b) nếu bạn cần loại bỏ phần tử bằng giá trị của phần tử (int):

function remove(arr, value) {
  return arr.reduce((prev, x, i) => prev.concat(x !== value ? [x] : []), []);
}

Vì vậy, theo cách này, chúng ta có thể trả về một mảng mới (sẽ là một cách chức năng thú vị - tốt hơn nhiều so với sử dụng Push hoặc splice) với phần tử bị loại bỏ.

0
alejoko
Array.prototype.remove = function(x) {
    var y=this.slice(x+1);
    var z=[];
    for(i=0;i<=x-1;i++) {
        z[z.length] = this[i];
    }

    for(i=0;i<y.length;i++){
        z[z.length]=y[i];
    }

    return z;
}
0
user4109793
var arr =[1,2,3,4,5];

arr.splice(0,1)

console.log(arr)

Đầu ra [2, 3, 4, 5];

0
Shahriar Ahmad