Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Сравнение массивов (http://www.flasher.ru/forum/showthread.php?t=205131)

Spellbreaker 20.11.2013 02:26

Сравнение массивов
 
Описанный метод проверяет имена объектов массива list на полное соответствие с элементами массива jointList путем поочередного сравнения. Есть ли какой-то более простой способ делать подобные сравнения? Может быть есть какие-то базовые методы для этих целей?

Код AS1/AS2:

jointList = new Array()
jointList["Spinpoint"] = ["mountpoint","reciever"]
 
function checkJoints(list){
        var match:Number
        for (_jname in jointList){
                match = 0
                trace("checking "+_jname)
                for (_type in jointList[_jname]){                       
                        for(_obj in list){
                                if (list[_obj].name == jointList[_jname][_type]){
                                        match++
                                        if( match == jointList[_jname].length ){
                                                trace(_jname+" full match")
                                        }
                                }
                        }
                }
        }
}


Hauts 20.11.2013 11:59

Spellbreaker, для ассоциативного массива проще использорвать объект:

Код AS1/AS2:

var list:Object = {};
list["someField"] = 1;

Я не совсем понимаю, что вы пытаетесь сравнить. Ну а вообще поочередное сравнение вполне нормальная практика. Если вам нужен логический результат — сравниваете только до первого несоответствия, к примеру.

Еще вариант (не заню только, насколько удачный) — сравнивать строки, если вы поля сравниваете:

Код AS1/AS2:

function objectFieldsToString(object:Object):String{
    var returnString:String = "";
    for(var i in object){
        returnString += i;
    }
    return returnString;
}

Грубо говоря, вы, основываясь на всех полях объекта, получаете строку. А по строкам можете сравнить, аналогичны ли поля двух объектов. Это подходит для сравнения целостности данных, к примеру. Когда есть стандартный объект с полями (к примеру, которые мы должны получить от сервера) и вам нужно узнать, всех ли полей хватает.

И еще. Насчет вашего примера, — много циклов. Лучше бы разбить на методы типа такого:

Код AS1/AS2:

function fieldInObject(object:Object, field:String):Boolean{
    return object[field] != null;
}
 
function valuesEqualInObjectsFields(objects:Array, field:String):Boolean{
    var totalObjects:Number = objects.length;
    for(var k:Number = 0; k < totalObjects; k++){
        var object_1:Object = objects[k];
        for(var j:Number = 0 ; j < totalObjects; j++){
          if(k != j){
                if(object_1[field] != objects[j][field]){
                    return false;
                }
          }
        }
    }
    return true;
}

Могу ошибиться, на ас2 давно не писал + пишу в браузере.

Spellbreaker 20.11.2013 12:35

Описанный в методе алгоритм проверяет на принадлежность к условному типу, в примере "Spinpoint", путем сравнения имен объектов из полученного массива со строками "Spinpoint". Для этого объявлена переменная, считающая количество соответствий. Таким образом если счетчик равен числу строк в условном типе, то полученный массив условно считается типом "Spinpoint" и дальше уже исполняется программная логика.

В любом случае, речь идет не об оптимизации, алгоритм работает так, как задумано, вопрос лишь в том, есть ли нативный метод, для решения таких задач. Просто у меня закралось подозрение, что он есть, а я изобретаю велосипед =)

Hauts 20.11.2013 12:45

Это как оператор "is"?

Код AS3:

if(someClassInstance is MyMegaClass){
    // ok condition
}

То есть вы методом описания нужных полей и последующим сравнением проверяете, является ли сущность идентичной по структуре с той, которая вам нужна?

Условный тип... Может классами оперировать все-таки?

Spellbreaker 20.11.2013 14:22

Я неспроста использовал слово "условный", так логичнее воспринимается суть сравнения. Классы являются всем, что наследуют, следовательно при таком сравнении, даже "чистые" экземпляры классов сравнивались бы по тому же принципу, но уже с классом вместо имени объекта.


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

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