Удаление свойств массива/объекта
У меня есть большой список различных продуктов, которые выводятся на экран. Эта маленькая игра, где каждый продукт рисуется на экране. Пользователь может удалять, добавлять любой продукт из списка. Так вот возник вопрос как оптимальнее хранить список продуктов. На выбор есть 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 для удаления. Так вот список у меня большой и каждый продукт рисуется на экран, по-этому не знаю как оптимальнее организовать список для быстрого удаления экземпляров. Слышал, что работа с массивом быстрее чем с хеш-объектом. Как поступить? |
А добавляешь в объект как? :) Элементы массива по-простому можно через filter удалять (для старых браузеров нужно заполифиллить), но самый правильный способ - это использовать Set из ECMAScript 6. ES6 пока что неутвержден, пользоваться им можно через компиляцию с помощью, например, https://6to5.github.io/index.html или https://github.com/termi/es6-transpiler
|
goods[id++] = new Product(); //добавление в объект goods.push(new Product()); //добавление в массив Я хочу использовать пока обычный способ, без es6 и тд. Мне просто интереснее какой способ будет оптимальный. |
Цитата:
Вывод - для работы хранить массив, для быстрого доступа хэш-таблицу с уникальными 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, массив в 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 - для быстрого доступа. Впрочем это имеет смысл только на действительно больших количествах. Иначе и обычного массива хватит. |
Ухты, интересно. Жаль только, кол-во объектов * 2 ( Память наверно ругаться будет из-за лишней ссылки на объект. Думаю, всё же остановлюсь на простом массиве.
|
javacrypt, именно что ссылки. Мелочь это.
|
Часовой пояс GMT +3, время: 16:44. |