7

Как удалить объекты из ассоциативного массива в JavaScript?

30

Проблема: Удаление свойства из объекта в JavaScript

У меня есть следующий код:

var myArray = new Object();
myArray["firstname"] = "Bob";
myArray["lastname"] = "Smith";
myArray["age"] = 25;

Теперь, если я хочу удалить свойство "lastname", есть ли какой-то эквивалент для myArray["lastname"].remove()?

Мне нужно, чтобы элемент был удален, потому что количество элементов имеет значение, и я хочу поддерживать порядок в коде. Как правильно удалить свойство из объекта в JavaScript?

5 ответ(ов)

0

Это только удаляет объект, но длина массива остаётся прежней.

Чтобы удалить элемент из массива, вам нужно сделать что-то вроде этого:

array.splice(index, 1);
0

Все объекты в JavaScript реализованы как хэш-таблицы или ассоциативные массивы. Таким образом, следующие записи эквивалентны:

alert(myObj["SomeProperty"]);
alert(myObj.SomeProperty);

Как уже упоминалось, "удалить" свойство из объекта можно с помощью ключевого слова delete, и его можно использовать двумя способами:

delete myObj["SomeProperty"];
delete myObj.SomeProperty;

Надеюсь, дополнительная информация будет полезна!

0

Хотя принятый ответ верен, в нем отсутствует объяснение, почему это работает.

Прежде всего, ваш код должен отражать тот факт, что это не массив:

var myObject = new Object();
myObject["firstname"] = "Bob";
myObject["lastname"] = "Smith";
myObject["age"] = 25;

Обратите внимание, что все объекты (включая Array) могут быть использованы таким образом. Однако не следует ожидать, что стандартные функции массива JavaScript (pop, push и т.д.) будут работать с объектами!

Как было сказано в принятом ответе, вы можете использовать оператор delete, чтобы удалить записи из объектов:

delete myObject["lastname"];

Вам следует решить, каким путем вы хотите идти — использовать объекты (ассоциативные массивы / словари) или использовать массивы (карты). Никогда не смешивайте их.

0

В 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.

0

В вашем коде есть несколько ошибок, которые могут привести к неправильному функционированию метода 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");

Обратите внимание на следующие изменения:

  1. Метод removeItem имеется в прототипе Array, так как вы работаете с массивом.
  2. Используется цикл for в обратном порядке (for (let i = this.length - 1; i >= 0; i--)) для предотвращения проблем с изменением индексов при удалении элементов.
  3. Проверка value === undefined используется для предотвращения удалений, если значение не задано.

Теперь вызов collection.removeItem("id", "87353080-8f49-46b9-9281-162a41ddb8df"); корректно удалит объект с указанным идентификатором из массива collection.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь