Как удалить определенный элемент массива JavaScript? Javascript - элементов - удалить определенный элемент массива js Javascript удаление элемента массива по индексу

The JavaScript delete operator removes a property from an object; if no more references to the same property are held, it is eventually released automatically.

The source for this interactive example is stored in a GitHub repository. If you"d like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.

Syntax delete expression

Any variable defined with var is marked as non-configurable. In the following example, salary is non-configurable and cannot be deleted. In non-strict mode, the delete operation will return false .

Function Employee() { delete salary; var salary; } Employee();

Let"s see how the same code behaves in strict mode. Instead of returning false , the statement raises a SyntaxError .

"use strict"; function Employee() { delete salary; // SyntaxError var salary; } // Similarly, any direct access to a function // with delete will raise a SyntaxError function DemoFunction() { //some code } delete DemoFunction; // SyntaxError

Examples // Creates the property adminName on the global scope. adminName = "xyz"; // Creates the property empCount on the global scope. // Since we are using var, this is marked as non-configurable. The same is true of let and const. var empCount = 43; EmployeeDetails = { name: "xyz", age: 5, designation: "Developer" }; // adminName is a property of the global scope. // It can be deleted since it is created without var, // and is therefore configurable. delete adminName; // returns true // On the contrary, empCount is not configurable // since var was used. delete empCount; // returns false // delete can be used to remove properties from objects. delete EmployeeDetails.name; // returns true // Even when the property does not exist, delete returns "true". delete EmployeeDetails.salary; // returns true // delete does not affect built-in static properties. delete Math.PI; // returns false // EmployeeDetails is a property of the global scope. // Since it was defined without "var", it is marked configurable. delete EmployeeDetails; // returns true function f() { var z = 44; // delete doesn"t affect local variable names delete z; // returns false } delete and the prototype chain

In the following example, we delete an own property of an object while a property with the same name is available on the prototype chain:

Function Foo() { this.bar = 10; } Foo.prototype.bar = 42; var foo = new Foo(); // foo.bar is associated with the // own property. console.log(foo.bar); // 10 // Delete the own property within the // foo object. delete foo.bar; // returns true // foo.bar is still available in the // prototype chain. console.log(foo.bar); // 42 // Delete the property on the prototype. delete Foo.prototype.bar; // returns true // The "bar" property can no longer be // inherited from Foo since it has been // deleted. console.log(foo.bar); // undefined

Deleting array elements

When you delete an array element, the array length is not affected. This holds even if you delete the last element of the array.

When the delete operator removes an array element, that element is no longer in the array. In the following example, trees is removed with delete .

Var trees = ["redwood", "bay", "cedar", "oak", "maple"]; delete trees; if (3 in trees) { // this is not executed }

If you want an array element to exist but have an undefined value, use the undefined value instead of the delete operator. In the following example, trees is assigned the value undefined, but the array element still exists:

Var trees = ["redwood", "bay", "cedar", "oak", "maple"]; trees = undefined; if (3 in trees) { // this is executed }

If instead, you want to remove an array element by changing the contents of the array, use the splice method. In the following example, trees is removed from the array completely using splice :

Var trees = ["redwood", "bay", "cedar", "oak", "maple"]; trees.splice(3,1); console.log(trees); // ["redwood", "bay", "cedar", "maple"]

Specifications Specification Status Comment
ECMAScript Latest Draft (ECMA-262)
Draft
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of "The delete Operator" in that specification.
Standard
ECMAScript 5.1 (ECMA-262)
The definition of "The delete Operator" in that specification.
Standard
ECMAScript 1st Edition (ECMA-262)
The definition of "The delete Operator" in that specification.
Standard Initial definition. Implemented in JavaScript 1.2.
Browser compatibility

The compatibility table on this page is generated from structured data. If you"d like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.

Update compatibility data on GitHub

Desktop Mobile Server Chrome Edge Firefox Internet Explorer Opera Safari Android webview Chrome for Android Firefox for Android Opera for Android Safari on iOS Samsung Internet Node.js delete
Chrome Full support 1 Edge Full support 12 Firefox Full support 1 IE Full support 4 Opera Full support Yes Safari Full support Yes WebView Android Full support 1 Chrome Android Full support 18 Firefox Android Full support 4 Opera Android Full support Yes Safari iOS Full support Yes Samsung Internet Android Full support 1.0 nodejs Full support Yes
Legend Full support Full support Cross-browser notes

Although ECMAScript makes iteration order of objects implementation-dependent, it may appear that all major browsers support an iteration order based on the earliest added property coming first (at least for properties not on the prototype). However, in the case of Internet Explorer, when one uses delete on a property, some confusing behavior results, preventing other browsers from using simple objects like object literals as ordered associative arrays. In Explorer, while the property value is indeed set to undefined, if one later adds back a property with the same name, the property will be iterated in its old position--not at the end of the iteration sequence as one might expect after having deleted the property and then added it back.

сдвиг

Используйте.shift для удаления первого элемента массива.

Например:

Var array = ; array.shift();

массив приводит к:

Например:

Var array = ; array.pop();

массив приводит к:

Оба метода возвращают удаленный элемент;

сращивание

Используйте.splice() чтобы удалить ряд элементов из массива. .splice() принимает два параметра, начальный индекс и необязательное количество элементов для удаления. Если второй параметр не.splice() удалит все элементы из начального индекса через конец массива.

Например:

Var array = ; array.splice(1, 2);

оставляет array , содержащий:

Возврат array.splice() - это новый массив, содержащий удаленные элементы. В приведенном выше примере возврат будет следующим:

Таким образом, опускание второго параметра эффективно разбивает массив на два массива с исходным окончанием до указанного индекса:

Var array = ; array.splice(2);

Оставляет array содержащий и возвращает .

удалять

Используйте delete для удаления элемента из массива без изменения длины массива:

Var array = ; console.log(array.length); // 5 delete array; console.log(array); // console.log(array.length); // 5

Array.prototype.length

Присвоение значения length массива изменяет длину на заданное значение. Если новое значение меньше длины массива, элементы будут удалены с конца значения.

Array = ; array.length = 2; console.log(array); //



Как удалить элемент из массива по значению? (20)

// отредактировал спасибо MarcoCI за советы

попробуй это:

Function wantDelete(item, arr){ for (var i=0;i !(comment.Id === commentId));

Вот версия, в которой используется функция inArray jQuery:

Var index = $.inArray(item, array); if (index != -1) { array.splice(index, 1); }

Вы можете добиться этого, используя функцию Lodash _.remove .

var array = ["three", "seven", "eleven"]; var evens = _.remove(array, function(e) { return e !== "seven"; }); console.log(evens);

Const _ = require("lodash"); _.without(, 2); // ->

Действительно, я не понимаю, почему это невозможно решить с помощью

Arr = arr.filter(value => value !== "seven");

Или, может быть, вы хотите использовать vanilla JS

Arr = arr.filter(function(value) { return value !== "seven" });

Другой вариант:

If (!Array.prototype.removeArr) { Array.prototype.removeArr = function(arr) { if(!Array.isArray(arr)) arr=;//let"s be nice to people who put a non-array value here.. that could be me! var that = this; if(arr.length){ var i=0; while(i-1){ that.splice(i,1); }else i++; } } return that; } }

Это indexOf () внутри цикла снова, но в предположении, что массив для удаления является малым относительно массива, который нужно очистить; каждое удаление сокращает цикл while.

Это позволит вам сделать следующее:

Var ary = ["three", "seven", "eleven"]; var aryWithoutSeven = ary.filter(function(value) { return value != "seven" }); console.log(aryWithoutSeven); // returns ["three", "eleven"]

Это также было отмечено в этой теме где-то еще: https://.com/a/20827100/293492

Не используйте вариант с delete - он делает отверстие в массиве, так как он не переиндексирует элементы после удаленного элемента.

> Array.prototype.remove=function(v){ ... delete this ... }; > var myarray=["3","24","55","2"]; undefined > myarray.remove("55"); undefined > myarray [ "3", "24", "2" ]

Один лайнер сделает это,

Var ary = ["three", "seven", "eleven"]; // Remove item "seven" from array var filteredAry = ary.filter(function(e) { return e !== "seven" }) //=> ["three", "eleven"] // In ECMA6 (arrow function syntax): var filteredAry = ary.filter(e => e !== "seven")

Это использует функцию filter в JS. Он поддерживается в IE9 и выше.

filter () вызывает предоставленную функцию обратного вызова один раз для каждого элемента в массиве и создает новый массив из всех значений, для которых обратный вызов возвращает значение, которое приводит к истинному. callback вызывается только для индексов массива, которым присвоены значения; он не вызывается для индексов, которые были удалены или которые никогда не были присвоены значениям. Элементы массива, которые не проходят тест обратного вызова, просто пропускаются и не включаются в новый массив.

Таким образом, в основном, это то же самое, что и все остальные for (var key in ary) { ... } решений, за исключением того, что for in поддерживается как IE6.

В принципе, фильтр - это метод удобства, который выглядит намного лучше (и является цепным), в отличие от конструктора for in (AFAIK).

Проверьте это:

For(var i in array){ if(array[i]=="seven"){ array.splice(i,1); break; } }

и в функции:

Function removeItem(array, item){ for(var i in array){ if(array[i]==item){ array.splice(i,1); break; } } } removeItem(array, "seven");

Удаление всех совпадающих элементов из массива (а не только первый, как кажется, самый общий ответ здесь):

While ($.inArray(item, array) > -1) { array.splice($.inArray(item, array), 1); }

Я использовал jQuery для тяжелой работы, но вы поняли, хотите ли вы поехать на родной язык.

Хитрость заключается в том, чтобы пройти через массив от начала до начала, поэтому вы не испортите индексы при удалении элементов.

Var deleteMe = function(arr, me){ var i = arr.length; while(i--) if(arr[i] === me) arr.splice(i,1); } var arr = ["orange","red","black", "orange", "white" , "orange" ]; deleteMe(arr , "orange");

arr теперь ["красный", "черный", "белый"]

Function cleanArrayOfSpecificTerms(array,unwantedTermsArray) { $.each(unwantedTermsArray, function(index, value) { var index = array.indexOf(value); if (index > -1) { array.splice(index, 1); } }); return array; }

Чтобы использовать, выполните следующие действия:

Var notInclude = ["Not","No","First","Last","Prior","Next", "dogs","cats"]; var splitTerms = ["call", "log", "dogs", "cats", "topic", "change", "pricing"]; cleanArrayOfSpecificTerms(splitTerms,notInclude)

Я попытался использовать метод функции из jbaron выше, но обнаружил, что мне нужно сохранить исходный массив без изменений для использования позже и создать новый массив следующим образом:

Var newArray = referenceArray;

Function newArrRemoveItem(array, item, newArray){ for(var i = 0; i < array.length; i++) { if(array[i]!=item){ newArray.push(array[i]); } } }

Затем я использую его так:

Var vesselID = record.get("VesselID"); var otherVessels = new Array(); newArrRemoveItem(vesselArr,vesselID,otherVessels);

Теперь судноArr остается неповрежденным, и каждый раз, когда я выполняю приведенный выше код, массив otherVessels включает в себя все, кроме последнего элемента CAID.

indexOf - это вариант, но его реализация в основном ищет весь массив для значения, поэтому время выполнения растет с размером массива. (так что это в каждом браузере, я думаю, я только проверял Firefox).

У меня нет IE6 для проверки, но я бы назвал это безопасной ставкой, что вы можете проверить по крайней мере миллион элементов массива в секунду таким образом практически на любой клиентской машине. Если [размер массива] * [поисковые запросы в секунду] может вырасти больше миллиона, вы должны рассмотреть другую реализацию.

В основном вы можете использовать объект для создания индекса для вашего массива, например:

Var index={"three":0, "seven":1, "eleven":2};

Любая нормальная среда JavaScript создаст индекс поиска для таких объектов, чтобы вы могли быстро перевести ключ в значение, независимо от того, сколько свойств имеет объект.

Это всего лишь базовый метод, в зависимости от ваших потребностей вы можете объединить несколько объектов и / или массивов, чтобы сделать те же данные быстро доступными для поиска для разных свойств. Если вы укажете свои конкретные потребности, я могу предложить более конкретную структуру данных.

//This function allows remove even array from array var removeFromArr = function(arr, elem) { var i, len = arr.length, new_arr = , sort_fn = function (a, b) { return a - b; }; for (i = 0; i < len; i += 1) { if (typeof elem === "object" && typeof arr[i] === "object") { if (arr[i].toString() === elem.toString()) { continue; } else { if (arr[i].sort(sort_fn).toString() === elem.sort(sort_fn).toString()) { continue; } } } if (arr[i] !== elem) { new_arr.push(arr[i]); } } return new_arr; }

Пример использования

Var arr = , "abc", 1, "1", 1]; removeFromArr(arr, 1); //["2", , "abc", "1"] var arr = [ , 2, "a", , ]; removeFromArr(arr, ); //]

Let arr = ; console.log(arr); //result let index = arr.indexOf(30); if (index > -1) { arr.splice(index, 1); } console.log(arr); //result

Var index = array.indexOf("item"); if(index!=-1){ array.splice(index, 1); }



удалить определенный элемент массива js (20)

Есть ли способ удалить элемент из массива JavaScript?

Учитывая массив:

Var ary = ["three", "seven", "eleven"];

Я хотел бы сделать что-то вроде:

RemoveItem("seven", ary);

Я просмотрел splice() но это только удаляет номер позиции, тогда как мне нужно что-то, чтобы удалить элемент по его значению.

// отредактировал спасибо MarcoCI за советы

попробуй это:

Function wantDelete(item, arr){ for (var i=0;i !(comment.Id === commentId));

Вот версия, в которой используется функция inArray jQuery:

Var index = $.inArray(item, array); if (index != -1) { array.splice(index, 1); }

Вы можете добиться этого, используя функцию Lodash _.remove .

var array = ["three", "seven", "eleven"]; var evens = _.remove(array, function(e) { return e !== "seven"; }); console.log(evens);

Const _ = require("lodash"); _.without(, 2); // ->

Действительно, я не понимаю, почему это невозможно решить с помощью

Arr = arr.filter(value => value !== "seven");

Или, может быть, вы хотите использовать vanilla JS

Arr = arr.filter(function(value) { return value !== "seven" });

Другой вариант:

If (!Array.prototype.removeArr) { Array.prototype.removeArr = function(arr) { if(!Array.isArray(arr)) arr=;//let"s be nice to people who put a non-array value here.. that could be me! var that = this; if(arr.length){ var i=0; while(i-1){ that.splice(i,1); }else i++; } } return that; } }

Это indexOf () внутри цикла снова, но в предположении, что массив для удаления является малым относительно массива, который нужно очистить; каждое удаление сокращает цикл while.

Это позволит вам сделать следующее:

Var ary = ["three", "seven", "eleven"]; var aryWithoutSeven = ary.filter(function(value) { return value != "seven" }); console.log(aryWithoutSeven); // returns ["three", "eleven"]

Это также было отмечено в этой теме где-то еще: https://.com/a/20827100/293492

Не используйте вариант с delete - он делает отверстие в массиве, так как он не переиндексирует элементы после удаленного элемента.

> Array.prototype.remove=function(v){ ... delete this ... }; > var myarray=["3","24","55","2"]; undefined > myarray.remove("55"); undefined > myarray [ "3", "24", "2" ]

Один лайнер сделает это,

Var ary = ["three", "seven", "eleven"]; // Remove item "seven" from array var filteredAry = ary.filter(function(e) { return e !== "seven" }) //=> ["three", "eleven"] // In ECMA6 (arrow function syntax): var filteredAry = ary.filter(e => e !== "seven")

Это использует функцию filter в JS. Он поддерживается в IE9 и выше.

filter () вызывает предоставленную функцию обратного вызова один раз для каждого элемента в массиве и создает новый массив из всех значений, для которых обратный вызов возвращает значение, которое приводит к истинному. callback вызывается только для индексов массива, которым присвоены значения; он не вызывается для индексов, которые были удалены или которые никогда не были присвоены значениям. Элементы массива, которые не проходят тест обратного вызова, просто пропускаются и не включаются в новый массив.

Таким образом, в основном, это то же самое, что и все остальные for (var key in ary) { ... } решений, за исключением того, что for in поддерживается как IE6.

В принципе, фильтр - это метод удобства, который выглядит намного лучше (и является цепным), в отличие от конструктора for in (AFAIK).

Проверьте это:

For(var i in array){ if(array[i]=="seven"){ array.splice(i,1); break; } }

и в функции:

Function removeItem(array, item){ for(var i in array){ if(array[i]==item){ array.splice(i,1); break; } } } removeItem(array, "seven");

Удаление всех совпадающих элементов из массива (а не только первый, как кажется, самый общий ответ здесь):

While ($.inArray(item, array) > -1) { array.splice($.inArray(item, array), 1); }

Я использовал jQuery для тяжелой работы, но вы поняли, хотите ли вы поехать на родной язык.

Хитрость заключается в том, чтобы пройти через массив от начала до начала, поэтому вы не испортите индексы при удалении элементов.

Var deleteMe = function(arr, me){ var i = arr.length; while(i--) if(arr[i] === me) arr.splice(i,1); } var arr = ["orange","red","black", "orange", "white" , "orange" ]; deleteMe(arr , "orange");

arr теперь ["красный", "черный", "белый"]

Function cleanArrayOfSpecificTerms(array,unwantedTermsArray) { $.each(unwantedTermsArray, function(index, value) { var index = array.indexOf(value); if (index > -1) { array.splice(index, 1); } }); return array; }

Чтобы использовать, выполните следующие действия:

Var notInclude = ["Not","No","First","Last","Prior","Next", "dogs","cats"]; var splitTerms = ["call", "log", "dogs", "cats", "topic", "change", "pricing"]; cleanArrayOfSpecificTerms(splitTerms,notInclude)

Я попытался использовать метод функции из jbaron выше, но обнаружил, что мне нужно сохранить исходный массив без изменений для использования позже и создать новый массив следующим образом:

Var newArray = referenceArray;

Function newArrRemoveItem(array, item, newArray){ for(var i = 0; i < array.length; i++) { if(array[i]!=item){ newArray.push(array[i]); } } }

Затем я использую его так:

Var vesselID = record.get("VesselID"); var otherVessels = new Array(); newArrRemoveItem(vesselArr,vesselID,otherVessels);

Теперь судноArr остается неповрежденным, и каждый раз, когда я выполняю приведенный выше код, массив otherVessels включает в себя все, кроме последнего элемента CAID.

indexOf - это вариант, но его реализация в основном ищет весь массив для значения, поэтому время выполнения растет с размером массива. (так что это в каждом браузере, я думаю, я только проверял Firefox).

У меня нет IE6 для проверки, но я бы назвал это безопасной ставкой, что вы можете проверить по крайней мере миллион элементов массива в секунду таким образом практически на любой клиентской машине. Если [размер массива] * [поисковые запросы в секунду] может вырасти больше миллиона, вы должны рассмотреть другую реализацию.

В основном вы можете использовать объект для создания индекса для вашего массива, например:

Var index={"three":0, "seven":1, "eleven":2};

Любая нормальная среда JavaScript создаст индекс поиска для таких объектов, чтобы вы могли быстро перевести ключ в значение, независимо от того, сколько свойств имеет объект.

Это всего лишь базовый метод, в зависимости от ваших потребностей вы можете объединить несколько объектов и / или массивов, чтобы сделать те же данные быстро доступными для поиска для разных свойств. Если вы укажете свои конкретные потребности, я могу предложить более конкретную структуру данных.

//This function allows remove even array from array var removeFromArr = function(arr, elem) { var i, len = arr.length, new_arr = , sort_fn = function (a, b) { return a - b; }; for (i = 0; i < len; i += 1) { if (typeof elem === "object" && typeof arr[i] === "object") { if (arr[i].toString() === elem.toString()) { continue; } else { if (arr[i].sort(sort_fn).toString() === elem.sort(sort_fn).toString()) { continue; } } } if (arr[i] !== elem) { new_arr.push(arr[i]); } } return new_arr; }

Пример использования

Var arr = , "abc", 1, "1", 1]; removeFromArr(arr, 1); //["2", , "abc", "1"] var arr = [ , 2, "a", , ]; removeFromArr(arr, ); //]

Let arr = ; console.log(arr); //result let index = arr.indexOf(30); if (index > -1) { arr.splice(index, 1); } console.log(arr); //result

Var index = array.indexOf("item"); if(index!=-1){ array.splice(index, 1); }