Как удалить объекты из ассоциативного массива в 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?