Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.11.2014, 15:22
Интересующийся
Отправить личное сообщение для javacrypt Посмотреть профиль Найти все сообщения от javacrypt
 
Регистрация: 10.11.2014
Сообщений: 12

Удаление свойств массива/объекта
У меня есть большой список различных продуктов, которые выводятся на экран. Эта маленькая игра, где каждый продукт рисуется на экране. Пользователь может удалять, добавлять любой продукт из списка. Так вот возник вопрос как оптимальнее хранить список продуктов. На выбор есть 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 для удаления.
Так вот список у меня большой и каждый продукт рисуется на экран, по-этому не знаю как оптимальнее организовать список для быстрого удаления экземпляров. Слышал, что работа с массивом быстрее чем с хеш-объектом. Как поступить?

Последний раз редактировалось javacrypt, 22.11.2014 в 15:27.
Ответить с цитированием
  #2 (permalink)  
Старый 22.11.2014, 16:02
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

А добавляешь в объект как? Элементы массива по-простому можно через filter удалять (для старых браузеров нужно заполифиллить), но самый правильный способ - это использовать Set из ECMAScript 6. ES6 пока что неутвержден, пользоваться им можно через компиляцию с помощью, например, https://6to5.github.io/index.html или https://github.com/termi/es6-transpiler
Ответить с цитированием
  #3 (permalink)  
Старый 22.11.2014, 16:07
Интересующийся
Отправить личное сообщение для javacrypt Посмотреть профиль Найти все сообщения от javacrypt
 
Регистрация: 10.11.2014
Сообщений: 12

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

Я хочу использовать пока обычный способ, без es6 и тд. Мне просто интереснее какой способ будет оптимальный.
Ответить с цитированием
  #4 (permalink)  
Старый 22.11.2014, 16:10
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,585

Сообщение от javacrypt Посмотреть сообщение
Слышал, что работа с массивом быстрее чем с хеш-объектом. Как поступить?
Работа - быстрее. А по ключу - быстрее поиск. Причём пока быстр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); //добавление в массив
красивый и удобный вариант.)
__________________
29375, 35

Последний раз редактировалось Aetae, 22.11.2014 в 16:25.
Ответить с цитированием
  #5 (permalink)  
Старый 22.11.2014, 17:59
Интересующийся
Отправить личное сообщение для javacrypt Посмотреть профиль Найти все сообщения от javacrypt
 
Регистрация: 10.11.2014
Сообщений: 12

Сообщение от Aetae
Таки дошло что похоже "так" вы не делаете, а просто привели пример, подумал что добавление идёт ~так:
я просто привел пример как я добавлял бы экземпляры продуктов если бы использовал массив или объект.
Сообщение от Aetae
var goods = [], temp = new Product();
goods[temp.id] = temp; //добавление в объект
goods.push(temp); //добавление в массив
Не уловил данный момент, сбивает столку, что объявляется массив и в него добавляется дважды один и тот же объект. Может я что-то не понимаю, так как я пришёл в js из java.
Ответить с цитированием
  #6 (permalink)  
Старый 22.11.2014, 18:11
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,585

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 - для быстрого доступа. Впрочем это имеет смысл только на действительно больших количествах. Иначе и обычного массива хватит.
__________________
29375, 35
Ответить с цитированием
  #7 (permalink)  
Старый 22.11.2014, 19:07
Интересующийся
Отправить личное сообщение для javacrypt Посмотреть профиль Найти все сообщения от javacrypt
 
Регистрация: 10.11.2014
Сообщений: 12

Ухты, интересно. Жаль только, кол-во объектов * 2 ( Память наверно ругаться будет из-за лишней ссылки на объект. Думаю, всё же остановлюсь на простом массиве.
Ответить с цитированием
  #8 (permalink)  
Старый 22.11.2014, 19:15
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,585

javacrypt, именно что ссылки. Мелочь это.
__________________
29375, 35
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
динамическое обновление свойств объекта в цикле grego Общие вопросы Javascript 3 04.12.2013 23:29
Динамическое удаление строк таблицы Tankist Events/DOM/Window 16 03.07.2013 16:42
Запись свойств картинок в строку Torch`Ok Events/DOM/Window 7 19.02.2013 16:49
установка css свойств по умолчанию за 1 шаг. mister_maxim (X)HTML/CSS 1 15.05.2012 09:18
получение значений свойств объекта bear9 Общие вопросы Javascript 3 01.12.2011 23:32