Как удалить объекты из ассоциативного массива в JavaScript?
Проблема: Удаление свойства из объекта в JavaScript
У меня есть следующий код:
var myArray = new Object();
myArray["firstname"] = "Bob";
myArray["lastname"] = "Smith";
myArray["age"] = 25;
Теперь, если я хочу удалить свойство "lastname", есть ли какой-то эквивалент для myArray["lastname"].remove()
?
Мне нужно, чтобы элемент был удален, потому что количество элементов имеет значение, и я хочу поддерживать порядок в коде. Как правильно удалить свойство из объекта в JavaScript?
5 ответ(ов)
Это только удаляет объект, но длина массива остаётся прежней.
Чтобы удалить элемент из массива, вам нужно сделать что-то вроде этого:
array.splice(index, 1);
Все объекты в JavaScript реализованы как хэш-таблицы или ассоциативные массивы. Таким образом, следующие записи эквивалентны:
alert(myObj["SomeProperty"]);
alert(myObj.SomeProperty);
Как уже упоминалось, "удалить" свойство из объекта можно с помощью ключевого слова delete
, и его можно использовать двумя способами:
delete myObj["SomeProperty"];
delete myObj.SomeProperty;
Надеюсь, дополнительная информация будет полезна!
Хотя принятый ответ верен, в нем отсутствует объяснение, почему это работает.
Прежде всего, ваш код должен отражать тот факт, что это не массив:
var myObject = new Object();
myObject["firstname"] = "Bob";
myObject["lastname"] = "Smith";
myObject["age"] = 25;
Обратите внимание, что все объекты (включая Array
) могут быть использованы таким образом. Однако не следует ожидать, что стандартные функции массива JavaScript (pop, push и т.д.) будут работать с объектами!
Как было сказано в принятом ответе, вы можете использовать оператор delete
, чтобы удалить записи из объектов:
delete myObject["lastname"];
Вам следует решить, каким путем вы хотите идти — использовать объекты (ассоциативные массивы / словари) или использовать массивы (карты). Никогда не смешивайте их.
В Airbnb Style Guide есть элегантный способ сделать это с использованием ECMAScript 7:
const myObject = {
a: 1,
b: 2,
c: 3
};
const { a, ...noA } = myObject;
console.log(noA); // => { b: 2, c: 3 }
С помощью оператора расширения объекта вы можете легко исключить определённые свойства из объекта. В приведённом примере мы присваиваем значение свойства a
переменной a
, а остальные свойства сохраняем в новый объект noA
. В результате переменная noA
будет содержать только свойства b
и c
.
В вашем коде есть несколько ошибок, которые могут привести к неправильному функционированию метода removeItem
. Проблема заключается в том, что вы пытаетесь использовать метод splice
на объекте, который не является массивом. Также использование цикла for...in
может привести к неочевидным ошибкам, так как он перебирает не только собственные свойства, но и свойства объекта-прототипа.
Вот правильный способ реализации метода removeItem
, который работает с массивами объектов:
Array.prototype.removeItem = function(key, value) {
if (value === undefined) return;
for (let i = this.length - 1; i >= 0; i--) {
if (this[i][key] === value) {
this.splice(i, 1);
}
}
};
var collection = [
{ id: "5f299a5d-7793-47be-a827-bca227dbef95", title: "one" },
{ id: "87353080-8f49-46b9-9281-162a41ddb8df", title: "two" },
{ id: "a1af832c-9028-4690-9793-d623ecc75a95", title: "three" }
];
collection.removeItem("id", "87353080-8f49-46b9-9281-162a41ddb8df");
Обратите внимание на следующие изменения:
- Метод
removeItem
имеется в прототипеArray
, так как вы работаете с массивом. - Используется цикл
for
в обратном порядке (for (let i = this.length - 1; i >= 0; i--)
) для предотвращения проблем с изменением индексов при удалении элементов. - Проверка
value === undefined
используется для предотвращения удалений, если значение не задано.
Теперь вызов collection.removeItem("id", "87353080-8f49-46b9-9281-162a41ddb8df");
корректно удалит объект с указанным идентификатором из массива collection
.
Как перемешать (сделать случайным) массив в JavaScript?
Как объединить два массива в JavaScript и удалить дубликаты?
Как удалить все дубликаты из массива объектов?
Самый быстрый способ дублирования массива в JavaScript: slice против цикла 'for'
Как проверить, содержит ли массив строку в TypeScript?