Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Удаление свойств массива/объекта (https://javascript.ru/forum/misc/51859-udalenie-svojjstv-massiva-obekta.html)

javacrypt 22.11.2014 15:22

Удаление свойств массива/объекта
 
У меня есть большой список различных продуктов, которые выводятся на экран. Эта маленькая игра, где каждый продукт рисуется на экране. Пользователь может удалять, добавлять любой продукт из списка. Так вот возник вопрос как оптимальнее хранить список продуктов. На выбор есть 2 способа:
var goods = {
   "0": new Apple(),
   "1": new Orange(),
   "2": new Cherry()
}

delete goods["1"];

Очень удобно удалять любой объект из хэш-таблицы, указывая только id.
Второй способ:
var goods = [
   new Apple(),
   new Orange(),
   new Cherry()
]

for (var i = 0; i < goods.length; i++) {
  if (goods[i].getId() == 1) {
    goods.splice(i, 1);
  }
}

Тут нужно пробегать по всему массиву, брать id каждого объекта и сравнивать с переданным id для удаления.
Так вот список у меня большой и каждый продукт рисуется на экран, по-этому не знаю как оптимальнее организовать список для быстрого удаления экземпляров. Слышал, что работа с массивом быстрее чем с хеш-объектом. Как поступить?

Erolast 22.11.2014 16:02

А добавляешь в объект как? :) Элементы массива по-простому можно через filter удалять (для старых браузеров нужно заполифиллить), но самый правильный способ - это использовать Set из ECMAScript 6. ES6 пока что неутвержден, пользоваться им можно через компиляцию с помощью, например, https://6to5.github.io/index.html или https://github.com/termi/es6-transpiler

javacrypt 22.11.2014 16:07

goods[id++] = new Product(); //добавление в объект
goods.push(new Product()); //добавление в массив

Я хочу использовать пока обычный способ, без es6 и тд. Мне просто интереснее какой способ будет оптимальный.

Aetae 22.11.2014 16:10

Цитата:

Сообщение от javacrypt (Сообщение 342337)
Слышал, что работа с массивом быстрее чем с хеш-объектом. Как поступить?

Работа - быстрее. А по ключу - быстрее поиск. Причём пока быстрee даже Map/Set.has().
Вывод - для работы хранить массив, для быстрого доступа хэш-таблицу с уникальными id. Очевидно же.) Оверхед минимален.

...upd:
Смотрю вы так и делаете. Знач всё гуд.)
Единственное что так: goods[id++] и даже так: goods[String(id++)] - делать не стоит: если 0 <= id < 2^32 то он автоматически станет ключом массива(с соотв. изменением length). Чтоб он стал свойством объекта id должен быть больше 2^32\меньше 0, либо не преобразовываться в число.(ну либо использовать отдельный объект для этого дела:))

...upd2:
Таки дошло что похоже "так" вы не делаете, а просто привели пример:), подумал что добавление идёт ~так:
var goods = [], temp = new Product();
goods[temp.id] = temp; //добавление в объект
goods.push(temp); //добавление в массив
красивый и удобный вариант.)

javacrypt 22.11.2014 17:59

Цитата:

Сообщение от Aetae
Таки дошло что похоже "так" вы не делаете, а просто привели пример, подумал что добавление идёт ~так:

я просто привел пример как я добавлял бы экземпляры продуктов если бы использовал массив или объект.
Цитата:

Сообщение от Aetae
var goods = [], temp = new Product();
goods[temp.id] = temp; //добавление в объект
goods.push(temp); //добавление в массив

Не уловил данный момент, сбивает столку, что объявляется массив и в него добавляется дважды один и тот же объект. Может я что-то не понимаю, так как я пришёл в js из java.

Aetae 22.11.2014 18:11

javacrypt, массив в js - это объект "с дополнительным обвесом", потому его можно использовать ещё и как обычный объект.
var goods = [];
var Product = (function(){
    var ids = 0;
    
    function Product(){
       this.id = ids++ + Math.random();
       
       goods.push( goods[this.id] = this ); 
    }
    Product.prototype = {
        toString: function(){return '[object Product]'}
    }
    
    return Product
}())

temp = new Product();

alert(temp.id)
alert(goods[temp.id])
alert(goods[0])


Соответственно массив для перебора, id - для быстрого доступа. Впрочем это имеет смысл только на действительно больших количествах. Иначе и обычного массива хватит.

javacrypt 22.11.2014 19:07

Ухты, интересно. Жаль только, кол-во объектов * 2 ( Память наверно ругаться будет из-за лишней ссылки на объект. Думаю, всё же остановлюсь на простом массиве.

Aetae 22.11.2014 19:15

javacrypt, именно что ссылки. Мелочь это.


Часовой пояс GMT +3, время: 16:44.