Форум 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=208036)

KBAC 29.05.2014 14:56

Зачем вам JSON, если у вас уже всё и так хорошо. Вы просто не то выводили в своём примере.
Код AS3:

 for each (var value:* in customers[i])
    {
        trace("Names", value);
    }

Вы здесь пытались вывести значение каждого поля объекта customers[i]. А вам нужно только поле "name".

Caseyrayan, ерунду-то не советуйте.

skyboy 29.05.2014 15:03

Цитата:

Сообщение от KBAC (Сообщение 1166936)
Зачем вам JSON, если у вас уже всё и так хорошо. Вы просто не то выводили в своём примере.
Код AS3:

 for each (var value:* in customers[i])
    {
        trace("Names", value);
    }


ну я изначально по сети получаю json-файл
Цитата:

Сообщение от KBAC (Сообщение 1166936)
Вы здесь пытались вывести значение каждого поля объекта customers[i]. А вам нужно только поле "name".

Caseyrayan, ерунду-то не советуйте.

Так я понял, что в том коде я получаю доступ к каждому полю. Но у меня не получается достучаться до поля name. Поэтому и спрашиваю, как сделать.

KBAC 29.05.2014 15:11

Если на входе строка то парсите JSON'ом. Получаете объект - массив.
Ваша изначальная ошибка была, что вы проходите циклом по customers и начинаете выводить все поля (цикл for each), вместо того чтобы обратиться к свойству customers[i] напрямую: customers[i]["name"]

LifeIsRhythm 29.05.2014 15:13

Код AS3:

var array:Array = [ { "name":"John", "email":"john@gmail.com" }, { "name":"Andrew", "email":"andrew@gmail.com" } ];
 
var length:int = array.length;
 
for (var i:int = 0; i < length; i++)
                trace(array[i].name);
 
var string:String = '[ { "name":"John", "email":"john@gmail.com" }, { "name":"Andrew", "email":"andrew@gmail.com" } ]';
var json:Object = JSON.parse(string);
 
for (var key:String in json)
                trace(json[key].name);


KBAC 29.05.2014 15:16

То что вы писали в 12:29
Цитата:

Код AS3:

for (var i:int = 0; i < customers.length; i++)
{
    for each (var value:* in customers[i])
    {
        //customers[i] - это объект, у него есть поле name - второй цикл тут не нужен
        //value - это значение поля - строка ("John", "john@gmail.com" и т.д.)
        //у него неn быть поля name
        trace("Names", value.name);
    }
}

UPD: ошибку выдает 1069: Не удалось найти свойство name в String; отсутствует значение по умолчанию.

skyboy 29.05.2014 15:22

Если оставить customers, как массив, то в таком случае при выводе значений
Код AS3:

var customers:Array = [{"name":"John","email":"john@gmail.com"},{"name":"Andrew","email":"andrew@gmail.com"}];
for (var i:int = 0; i < length; i++)
{
    trace(customers[i].name);    // Выдает undefined
    trace(customers[i]["name"]); // Выдает undefined
}

Если использовать вариант LifeIsRhythm
Код AS3:

var customers:String = '[{"name":"John","email":"john@gmail.com"},{"name":"Andrew","email":"andrew@gmail.com"}]';
var obj:Object = JSON.parse(customers);
for (var key:String in customers)
{
    trace(obj[key].name); // Ничего не выводится
}


ChuwY 29.05.2014 15:34

Тему пролистал по диагонали.
Вот мой вариант (с использованием первоначальных данных)

Код AS3:

public class SkyBoyTest
{
        private static const EMAIL_PROP_NAME:String = "email";
        private static const NAME_PROP_NAME:String = "name";
 
        private var customers:Array = [{"name":"John","email":"john@gmail.com"},{"name":"Andrew","email":"andrew@gmail.com"}];
 
        public function SkyBoyTest()
        {
                var customerNames:Vector.<String> = getCustomersNames();
 
                for each(var name:String in customerNames) {
                        var email:String = getCustomerEmailByName(name);
 
                        trace("customer. name : " + name + ", email : " + email);
                }
        }
 
        public function getCustomersNames():Vector.<String>
        {
                var names:Vector.<String> = new Vector.<String>();
 
                for each(var customer:Object in customers) {
                        if(NAME_PROP_NAME in customer) {
                                var name:String = customer[NAME_PROP_NAME];
 
                                names.push(name);
                        }
                }
 
                return names;
        }
 
        public function getCustomerByName(name:String):Object
        {
                for each(var customer:Object in customers) {
                        if(customer[NAME_PROP_NAME] == name) {
                                return customer;
                        }
                }
 
                return null;
        }
 
        public function getCustomerEmailByName(name:String):String
        {
                var customer:Object = getCustomerByName(name);
                var email:String = customer ? customer[EMAIL_PROP_NAME] : null;
 
                return email;
        }
}

На выходе:
Код:

customer. name : John, email : john@gmail.com
customer. name : Andrew, email : andrew@gmail.com

Хотя лично я распарсил бы этих кастомеров в типизированные объекты.

LifeIsRhythm 29.05.2014 15:38

Цитата:

Если использовать вариант LifeIsRhythm
Потому, что Вы неправильно скопировали.

KBAC 29.05.2014 15:50

Цитата:

Сообщение от LifeIsRhythm (Сообщение 1166948)
Потому, что Вы неправильно скопировали.

причём оба раза

caseyryan 29.05.2014 17:21

Цитата:

Сообщение от KBAC (Сообщение 1166936)
Caseyrayan, ерунду-то не советуйте.

В чем ерунда? Ваш совет не меньшая ерунда. См. второй пост, прежде чем советовать это
Цитата:

Вы здесь пытались вывести значение каждого поля объекта customers[i]. А вам нужно только поле "name".
И вообще, автор похоже сам не знает что у него там приходит. Не понятно массив там или строка.
Проблема вообще элементарная. Решается за 20 секунд, если знать что там на самом деле за данные.
У меня такой вариант, когда сервер присылает строку типа:
Цитата:

[{"key" : "value"}, {"key", "value"}]
используется в проектах очень часто. И все это легко разруливает JSON парсер (не стандартный плееровский, а из as3corelib). Он сам знает как обработать данные и что вернуть. Если ему скормить такую строку, то он вернет массив объектов.


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

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