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

skyboy 29.05.2014 13:16

Обход элементов во вложенном ассоциативном массиве
 
Собственно проблема следующая. У меня есть ассоциативный массив.
Код:

customers = [{"name":"John","email":"john@gmail.com"},{"name":"Andrew","email":"andrew@gmail.com"}]}
Я хочу обратится по ключу name к значениям.
Код AS3:

for (var i:int = 0; i < customers.length; i++)
{
    for each (var value:* in customers[i])
    {
        trace("Names", value);
    }
}

В таком случае выводятся все значения и ключа name и ключа email.
Код:

John
john@gmail.com
Andrew
andrew@gmail.com

А нужны только имена, без email.

caseyryan 29.05.2014 13:27

Код AS3:

 trace("Names", value.name);


skyboy 29.05.2014 13:29

Цитата:

Сообщение от caseyryan (Сообщение 1166923)
Код AS3:

 trace("Names", value.name);


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

caseyryan 29.05.2014 13:42

А, значит это не массив, а просто строка. Сначала надо через JSON ее превратить в Object.
Код AS3:

for (var i:int = 0; i < customers.length; i++)
{
    for each (var value:* in customers[i])
    {
        trace("Names", JSON.parse(value).name);
    }
}


skyboy 29.05.2014 13:53

Цитата:

Сообщение от caseyryan (Сообщение 1166925)
А, значит это не массив, а просто строка. Сначала надо через JSON ее превратить в Object.
Код AS3:

for (var i:int = 0; i < customers.length; i++)
{
    for each (var value:* in customers[i])
    {
        trace("Names", JSON.parse(value).name);
    }
}


та же ошибка: Error #1069 Не удалось найти свойство name в Number; отсутствует значение по умолчанию. Действительно я пытаюсь обработать json-файл, внутри которого содержатся те ключи, что я выше описал.

KBAC 29.05.2014 14:04

Код AS3:

for (var i:int = 0; i < customers.length; i++)
{
    trace(customers[i]["name"]);
}


caseyryan 29.05.2014 14:08

Цитата:

Сообщение от skyboy (Сообщение 1166926)
та же ошибка: Error #1069 Не удалось найти свойство name в Number; отсутствует значение по умолчанию. Действительно я пытаюсь обработать json-файл, внутри которого содержатся те ключи, что я выше описал.

что-то я внимания сразу не обратил. Тут же можно так:
Код AS3:

for (var i:String in customers) {
    var obj:Object = JSON.parse(customers[i]);
    trace(obj.name);
}

Но это при условии, что customers это точно массив, а не строка

skyboy 29.05.2014 14:28

Не в том и не в другом случае данные варианты не работает. customers это все таки строка. Я перепутал.

caseyryan 29.05.2014 14:32

Значит обработать надо сначала customers
Код AS3:

var array:Array = JSON.parse(customers);
for (var i:String in array) {
    var obj:Object = array[i];
    trace(obj.name);
}


skyboy 29.05.2014 14:41

В общем я сделал, как вы написали, но ругается на две строчки
Код AS3:

var customers:String = [{"name":"John","email":"john@gmail.com"},{"name":"Andrew","email":"andrew@gmail.com"}]};
var array:Array = JSON.parse(customers);
for (var i:String in array) {
    var obj:Object = array[i];
    trace(obj.name);
}

на первую строчку: Error 1067 Implicit coercion of a value of type Array to an unrelated type String
вторая строчка: Error 1118 Implicit coercion of a value with static type Object to a possibly unrelated type Array

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). Он сам знает как обработать данные и что вернуть. Если ему скормить такую строку, то он вернет массив объектов.

KBAC 29.05.2014 17:43

Цитата:

В чем ерунда? Ваш совет не меньшая ерунда
Вы пишите
Код AS3:

trace("Names", value.name);

Когда у автора в первом посте идёт обход по значениям полей элемента массива, и в value лежит значение поля. Естественно он ловит ошибку, так как value - строка, на что вы ему говорите - используй JSON!
Не лучший совет, не правда ли?

А на входе в customers - массив, иначе его код падал бы на customers[i].
Зачем торопиться помогать, не посмотрев даже в чём проблема? Только вредите.

caseyryan 29.05.2014 19:32

Цитата:

Когда у автора в первом посте идёт обход по значениям полей элемента массива, и в value лежит значение поля. Естественно он ловит ошибку, так как value - строка, на что вы ему говорите - используй JSON!
Не лучший совет, не правда ли?
Соглашусь, от части. С тем что я не досмотрел, что у него именно в массиве лежат объекты со строчными значениями. А на счет JSON это как раз лучшее решение. Только использовать его надо сразу после прихода сообщения с сервера. Оно ведь не приходит в виде массива, да? А приходит строка, которую собирает php через json_encode (ну или не php, не суть). Вот эту все строку надо скормить JSON'у, и получим на выходе аккуратненький массив объектов с нормальными ключами. То есть по сути та же работа, только без изобретения велосипедов.

KBAC 29.05.2014 20:58

Ну про сервер, вообще не было речи изначально))
Ладно, заканчиваем флудить.


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

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