Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 03.06.2014, 11:08
SvetozarPNZ вне форума Посмотреть профиль Отправить личное сообщение для SvetozarPNZ Найти все сообщения от SvetozarPNZ
  № 1  
Ответить с цитированием
SvetozarPNZ
 
Аватар для SvetozarPNZ

Регистрация: Dec 2009
Сообщений: 125
Записей в блоге: 1
По умолчанию Как создать в объекте свойство с заранее неизвестным именем

Моя задача состоит в создании ассоциативного массива, в котором имя каждого ключа генерируется программой. В справочнике нашел у класса Object такой метод
Код AS3:
setPropertyIsEnumerable
Как я понимаю, он создает свойство с динамическим именем, но здесь ничего не трассируется

Код AS3:
 
var obj:Object = new Object();
var str:String = 'любая строчка';
 
obj.setPropertyIsEnumerable(str, true);
 
for (var prop in obj) {
trace(prop)
}
Либо я неправильно понимаю назначение метода, либо у меня что-то в коде не то.
Подскажите, как создать для объекта свойство с динамическим именем.

Будут вопросы, зачем все это.
Заранее пишу:
1. Я собираю ссылки с загруженных веб-страниц.
2. Для проверки уникальности ссылок я сохраняю их в массив.
3. Для ускорения алгоритма проверки (ссылок может быть много миллионов) я пробую сортировать массив или использовать ассоциативный массив.
4. Я хочу в ключи ассоциативного массива записывать ссылки, чтобы быстрый доступ к ним осуществлял сам язык.

Старый 03.06.2014, 11:30
alexandrratush вне форума Посмотреть профиль Отправить личное сообщение для alexandrratush Найти все сообщения от alexandrratush
  № 2  
Ответить с цитированием
alexandrratush
 
Аватар для alexandrratush

Регистрация: Jul 2013
Адрес: Днепр
Сообщений: 529
Отправить сообщение для alexandrratush с помощью ICQ Отправить сообщение для alexandrratush с помощью Skype™
Может стоит использовать класс Dictionary?

Код AS3:
import flash.utils.Dictionary;
 
var dictionary:Dictionary = new Dictionary();
	dictionary["prop1"] = "Hello";
	dictionary["prop2"] = "world!";
 
trace(dictionary["prop1"]);
trace(dictionary["prop2"]);
Или использовать обычный массив со строками-ключами, тут почитать можно.

Старый 03.06.2014, 11:32
elder_Nosferatu вне форума Посмотреть профиль Отправить личное сообщение для elder_Nosferatu Найти все сообщения от elder_Nosferatu
  № 3  
Ответить с цитированием
elder_Nosferatu
 
Аватар для elder_Nosferatu

Регистрация: Nov 2010
Адрес: 48° 55'N 24° 42'E GMT +2:00
Сообщений: 399
Записей в блоге: 1
Код AS3:
var obj:Object = new Object();
var str:String = 'любая строчка';
 
obj[str] = true;
 
for (var prop in obj) {
trace(prop)
}

Старый 03.06.2014, 11:37
SvetozarPNZ вне форума Посмотреть профиль Отправить личное сообщение для SvetozarPNZ Найти все сообщения от SvetozarPNZ
  № 4  
Ответить с цитированием
SvetozarPNZ
 
Аватар для SvetozarPNZ

Регистрация: Dec 2009
Сообщений: 125
Записей в блоге: 1
Цитата:
Сообщение от alexandrratush Посмотреть сообщение
Может стоит использовать класс Dictionary?
А чем он лучше Object, что вы его решили предложить?

Цитата:
Сообщение от alexandrratush Посмотреть сообщение
Код AS3:
	dictionary["prop1"] = "Hello";
	dictionary["prop2"] = "world!";
Здесь имена ключей prop1 и prop2, а мне нужно динамическое любое имя. Или вы что-то другое имеете в виду?..

Добавлено через 5 минут
Цитата:
Сообщение от elder_Nosferatu Посмотреть сообщение
Код AS3:
var obj:Object = new Object();
var str:String = 'любая строчка';
 
obj[str] = true;
 
for (var prop in obj) {
trace(prop)
}
После таких простых решений чувствую себя тупым.
Спасибо!

Старый 03.06.2014, 11:49
alexandrratush вне форума Посмотреть профиль Отправить личное сообщение для alexandrratush Найти все сообщения от alexandrratush
  № 5  
Ответить с цитированием
alexandrratush
 
Аватар для alexandrratush

Регистрация: Jul 2013
Адрес: Днепр
Сообщений: 529
Отправить сообщение для alexandrratush с помощью ICQ Отправить сообщение для alexandrratush с помощью Skype™
Цитата:
Сообщение от SvetozarPNZ Посмотреть сообщение
Здесь имена ключей prop1 и prop2, а мне нужно динамическое любое имя. Или вы что-то другое имеете в виду?..
Код AS3:
import flash.utils.Dictionary;
 
var str:String = "любая строчка";
 
var dictionary:Dictionary = new Dictionary();
	dictionary["prop1"] = "Hello";
	dictionary[str] = "world!";
 
trace(dictionary["любая строчка"]);		//world!
trace(dictionary[str]);					//world!
Это не то что вам нужно?

Старый 03.06.2014, 11:51
elder_Nosferatu вне форума Посмотреть профиль Отправить личное сообщение для elder_Nosferatu Найти все сообщения от elder_Nosferatu
  № 6  
Ответить с цитированием
elder_Nosferatu
 
Аватар для elder_Nosferatu

Регистрация: Nov 2010
Адрес: 48° 55'N 24° 42'E GMT +2:00
Сообщений: 399
Записей в блоге: 1
Цитата:
Сообщение от alexandrratush Посмотреть сообщение
Может стоит использовать класс Dictionary?
А смысл? Объект использует строковые ключи, словарь же - это навороченый объект, для которого ключем может служить любой объект. Зачем платить больше?

Цитата:
Сообщение от SvetozarPNZ Посмотреть сообщение
Будут вопросы, зачем все это.
Заранее пишу:
1. Я собираю ссылки с загруженных веб-страниц.
2. Для проверки уникальности ссылок я сохраняю их в массив.
3. Для ускорения алгоритма проверки (ссылок может быть много миллионов) я пробую сортировать массив или использовать ассоциативный массив.
4. Я хочу в ключи ассоциативного массива записывать ссылки, чтобы быстрый доступ к ним осуществлял сам язык.
Судя по написаному вам нужна просто коллекция ссылок, а не упорядоченый массив ссылок. Какая разница, как ссылки расположены, главное, что они сохранены. В качестве колекции достаточно обычного объекта, ключами которого будут сами ссылки. А значения и вовсе не нужны - хоть true, хоть false, да хоть 666.
Код AS3:
var collection:Object = { };
collection[url_0] = true;
collection[url_1] = false;
collection[url_2] = 666;
collection[url_3] = null;
...
for (var url:String in collection) {
	trace(url, "- важные данные, а", collection[url], "- просто мусор...");
}
К стати, так вы решите вопрос уникальности без сортировки. Если попадутся две одинаковые ссылки, то они все равно будут единственным свойством объекта collection.

Старый 03.06.2014, 11:59
alexandrratush вне форума Посмотреть профиль Отправить личное сообщение для alexandrratush Найти все сообщения от alexandrratush
  № 7  
Ответить с цитированием
alexandrratush
 
Аватар для alexandrratush

Регистрация: Jul 2013
Адрес: Днепр
Сообщений: 529
Отправить сообщение для alexandrratush с помощью ICQ Отправить сообщение для alexandrratush с помощью Skype™
Цитата:
Сообщение от elder_Nosferatu Посмотреть сообщение
А смысл? Объект использует строковые ключи, словарь же - это навороченый объект, для которого ключем может служить любой объект. Зачем платить больше?
Не спорю. Упустил я момент что ТС нужно использовать строковый ключ.

Старый 03.06.2014, 12:10
SvetozarPNZ вне форума Посмотреть профиль Отправить личное сообщение для SvetozarPNZ Найти все сообщения от SvetozarPNZ
  № 8  
Ответить с цитированием
SvetozarPNZ
 
Аватар для SvetozarPNZ

Регистрация: Dec 2009
Сообщений: 125
Записей в блоге: 1
Судя по всему такое обращение к свойству obj[currentLink] перебирает все свойства объекта и не обеспечивает хорошей скорости работы скрипта. Значит сортировать будем.

Старый 03.06.2014, 12:14
ChuwY вне форума Посмотреть профиль Отправить личное сообщение для ChuwY Посетить домашнюю страницу ChuwY Найти все сообщения от ChuwY
  № 9  
Ответить с цитированием
ChuwY
 
Аватар для ChuwY

Регистрация: Nov 2009
Адрес: Тула / Москва
Сообщений: 734
Отправить сообщение для ChuwY с помощью ICQ Отправить сообщение для ChuwY с помощью Skype™
Цитата:
Сообщение от SvetozarPNZ Посмотреть сообщение
Судя по всему такое обращение к свойству obj[currentLink] перебирает все свойства объекта и не обеспечивает хорошей скорости работы скрипта. Значит сортировать будем.
Потому что нужно обращаться вот так:
Код AS3:
if(currentLink in obj) {
  doSomething();
}
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ"
Мои ачивки: художник-паразит.

Старый 03.06.2014, 12:19
SvetozarPNZ вне форума Посмотреть профиль Отправить личное сообщение для SvetozarPNZ Найти все сообщения от SvetozarPNZ
  № 10  
Ответить с цитированием
SvetozarPNZ
 
Аватар для SvetozarPNZ

Регистрация: Dec 2009
Сообщений: 125
Записей в блоге: 1
Цитата:
Сообщение от elder_Nosferatu Посмотреть сообщение
Судя по написаному вам нужна просто коллекция ссылок, а не упорядоченый массив ссылок. Какая разница, как ссылки расположены, главное, что они сохранены.
Все верно. Есть у меня идейка алгоритма, при котором проверка уникальности будет быстрой, но нужно, чтоб массив сортировался на лету. Т.е. в него ссылки добавлялись уже в алфавитном порядке.

Представьте миллиард ссылок. Как быстро проверить на уникальность новой тысячи? Для каждой перебирать весь миллиард?..

Добавлено через 2 минуты
Цитата:
Сообщение от ChuwY Посмотреть сообщение
Потому что нужно обращаться вот так:
Код AS3:
if(currentLink in obj) {
  doSomething();
}
Я так и обращался. Суть не меняется. Я уверен, что перебираются все свойства при запросе какого-то одного. Не знаю, как доказать, но 1500 ссылок за 15 секунд... Тут попахивает гребанным числом итераций.

Добавлено через 8 минут
Немножко приврал. Вот моя проверка
Код AS3:
if (!obj[currentLink]) obj[currentLink] = true;
А ваш пример не работает. Он ищет свойство с именем currentLink.

Создать новую тему Ответ Часовой пояс GMT +4, время: 21:53.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 21:53.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.