Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как создать в объекте свойство с заранее неизвестным именем (http://www.flasher.ru/forum/showthread.php?t=208081)

SvetozarPNZ 03.06.2014 11:08

Как создать в объекте свойство с заранее неизвестным именем
 
Моя задача состоит в создании ассоциативного массива, в котором имя каждого ключа генерируется программой. В справочнике нашел у класса 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. Я хочу в ключи ассоциативного массива записывать ссылки, чтобы быстрый доступ к ним осуществлял сам язык.

alexandrratush 03.06.2014 11:30

Может стоит использовать класс Dictionary?

Код AS3:

import flash.utils.Dictionary;
 
var dictionary:Dictionary = new Dictionary();
        dictionary["prop1"] = "Hello";
        dictionary["prop2"] = "world!";
 
trace(dictionary["prop1"]);
trace(dictionary["prop2"]);

Или использовать обычный массив со строками-ключами, тут почитать можно.

elder_Nosferatu 03.06.2014 11:32

Код AS3:

var obj:Object = new Object();
var str:String = 'любая строчка';
 
obj[str] = true;
 
for (var prop in obj) {
trace(prop)
}


SvetozarPNZ 03.06.2014 11:37

Цитата:

Сообщение от alexandrratush (Сообщение 1167263)
Может стоит использовать класс Dictionary?

А чем он лучше Object, что вы его решили предложить?

Цитата:

Сообщение от alexandrratush (Сообщение 1167263)
Код AS3:

        dictionary["prop1"] = "Hello";
        dictionary["prop2"] = "world!";


Здесь имена ключей prop1 и prop2, а мне нужно динамическое любое имя. Или вы что-то другое имеете в виду?..

Добавлено через 5 минут
Цитата:

Сообщение от elder_Nosferatu (Сообщение 1167264)
Код AS3:

var obj:Object = new Object();
var str:String = 'любая строчка';
 
obj[str] = true;
 
for (var prop in obj) {
trace(prop)
}


После таких простых решений чувствую себя тупым.
Спасибо!

alexandrratush 03.06.2014 11:49

Цитата:

Сообщение от SvetozarPNZ (Сообщение 1167265)
Здесь имена ключей 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!

Это не то что вам нужно?

elder_Nosferatu 03.06.2014 11:51

Цитата:

Сообщение от alexandrratush (Сообщение 1167263)
Может стоит использовать класс Dictionary?

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

Цитата:

Сообщение от SvetozarPNZ (Сообщение 1167261)
Будут вопросы, зачем все это.
Заранее пишу:
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.

alexandrratush 03.06.2014 11:59

Цитата:

Сообщение от elder_Nosferatu (Сообщение 1167268)
А смысл? Объект использует строковые ключи, словарь же - это навороченый объект, для которого ключем может служить любой объект. Зачем платить больше?

Не спорю. Упустил я момент что ТС нужно использовать строковый ключ. :)

SvetozarPNZ 03.06.2014 12:10

Судя по всему такое обращение к свойству obj[currentLink] перебирает все свойства объекта и не обеспечивает хорошей скорости работы скрипта. Значит сортировать будем.

ChuwY 03.06.2014 12:14

Цитата:

Сообщение от SvetozarPNZ (Сообщение 1167272)
Судя по всему такое обращение к свойству obj[currentLink] перебирает все свойства объекта и не обеспечивает хорошей скорости работы скрипта. Значит сортировать будем.

Потому что нужно обращаться вот так:
Код AS3:

if(currentLink in obj) {
  doSomething();
}


SvetozarPNZ 03.06.2014 12:19

Цитата:

Сообщение от elder_Nosferatu (Сообщение 1167268)
Судя по написаному вам нужна просто коллекция ссылок, а не упорядоченый массив ссылок. Какая разница, как ссылки расположены, главное, что они сохранены.

Все верно. Есть у меня идейка алгоритма, при котором проверка уникальности будет быстрой, но нужно, чтоб массив сортировался на лету. Т.е. в него ссылки добавлялись уже в алфавитном порядке.

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

Добавлено через 2 минуты
Цитата:

Сообщение от ChuwY (Сообщение 1167273)
Потому что нужно обращаться вот так:
Код AS3:

if(currentLink in obj) {
  doSomething();
}


Я так и обращался. Суть не меняется. Я уверен, что перебираются все свойства при запросе какого-то одного. Не знаю, как доказать, но 1500 ссылок за 15 секунд... Тут попахивает гребанным числом итераций.

Добавлено через 8 минут
Немножко приврал. Вот моя проверка
Код AS3:

if (!obj[currentLink]) obj[currentLink] = true;

А ваш пример не работает. Он ищет свойство с именем currentLink.


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

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