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

adman 05.04.2011 15:07

удаление дублей из массива
 
вот нашёл хороший вариант удаление дублей:
Код AS3:

var arr:Array = new Array();
 
arr.push("one");
arr.push("tru");
arr.push("fri");
arr.push("one");
arr.push("tru");
arr.push("fri");
 
removeDuplicate(arr);
function removeDuplicate(arr:Array):void {
        var i:int;
        var j:int;
        for (i = 0; i < arr.length - 1; i++) {
                for (j = i + 1; j < arr.length; j++) {
                        if (arr[i]===arr[j]) {
                                arr.splice(j, 1);
                        }
                }
        }
}
 
trace(arr)

но у меня идёт другие данные массива:
Код AS3:

var arr:Array = new Array();
 
arr.push({name:"one", manager:false});
arr.push({name:"tru", manager:true});
arr.push({name:"fri", manager:false});
arr.push({name:"one", manager:false});
arr.push({name:"tru", manager:true});
arr.push({name:"fri", manager:false});
 
removeDuplicate(arr);
function removeDuplicate(arr:Array):void {
        var i:int;
        var j:int;
        for (i = 0; i < arr.length - 1; i++) {
                for (j = i + 1; j < arr.length; j++) {
                        if (arr[i]===arr[j]) {
                                arr.splice(j, 1);
                        }
                }
        }
}
 
arr.forEach(traceEmployee);
function traceEmployee(element:*, index:int, arr:Array):void {
        trace(element.name);
}

помогите пожалуйста по удаление дублей

mayakwd 05.04.2011 15:21

Код AS3:

if (isObjectsEquals(arr[i], arr[j])) {
  ...
}
 
function isObjectsEquals(objA : Object, objB: Object) : Boolean {
  for (var prop : String in objA) {
    if (objA[prop] != objB[prop]) return false;
  }
  return true;
}

корявый частный вариант.

adman 05.04.2011 15:22

вот готовое решение мне помог Zebestov

Код AS3:

var arr:Array = new Array();
 
arr.push({name:"one", manager:false});
arr.push({name:"tru", manager:true});
arr.push({name:"fri", manager:false});
arr.push({name:"one", manager:false});
arr.push({name:"tru", manager:true});
arr.push({name:"fri", manager:false});
 
removeDuplicate(arr);
function removeDuplicate(arr:Array):void {
        var i:int;
        var j:int;
        for (i = 0; i < arr.length - 1; i++) {
                for (j = i + 1; j < arr.length; j++) {
                        if (arr[i].name===arr[j].name) {
                                arr.splice(j, 1);
                        }
                }
        }
}
arr.forEach(traceEmployee);
function traceEmployee(element:*, index:int, arr:Array):void {
        trace(element.name+" - "+ element.manager);
}


mayakwd 05.04.2011 15:26

это решение сравнивает только по полю name.

Zebestov 05.04.2011 15:35

Ну я там дальше дополнил ;)

Цитата:

а если по обоим полям, то:
Код AS3:

if (arr[i].name === arr[j].name && arr[i].manager === arr[j].manager)


P.S.
ну мы это уже обсудили =)

i.o. 05.04.2011 16:11

А мне так больше нравится :)
Код AS3:

var _member_toString:Function = function():String{
        return "{name:" + this.name + ", manager:" + this.manager + "}";
}
 
var arr:Array = [];
arr.push({name:"one", manager:false, toString:_member_toString});
arr.push({name:"tru", manager:true,  toString:_member_toString});
arr.push({name:"fri", manager:false, toString:_member_toString});
arr.push({name:"one", manager:false, toString:_member_toString});
arr.push({name:"tru", manager:true,  toString:_member_toString});
arr.push({name:"fri", manager:false, toString:_member_toString});
 
trace( "before: \n" + arr.join("\n") );
removeDuplicatesIn( arr );
trace( "after: \n" + arr.join("\n") );
 
function removeDuplicatesIn( array:Array ):void
{
        if( !array || array.length < 1 )
                return;
 
        var i:int = array.length;
        while( i-- > 0 )
        {
                var m:Object = array[i];
                var j:int = i;
                while( j-- > 0 )
                {
                        var n:Object = array[j];
                        if( n.name == m.name && n.manager == m.manager )
                        {
                                array.splice( i, 1 );
                                break;
                        }
                }
        }
}

Цитата:

before:
{name: one, manager:false}
{name: tru, manager:true}
{name: fri, manager:false}
{name: one, manager:false}
{name: tru, manager:true}
{name: fri, manager:false}
after:
{name: one, manager:false}
{name: tru, manager:true}
{name: fri, manager:false}

Zebestov 05.04.2011 16:21

И зачем _member_toString, если ты все равно сравниваешь два поля вручную? )

i.o. 05.04.2011 16:26

В оутпут выводить чтоб без гемора)
Код AS3:

trace( arr.join("\n") );

В принципе можно было бы и метод сравнения завести..
Смысл тут в другом - массив крутится с конца и нет бесконечных обращений к .length

Добавлено через 9 минут
Вот вообще универсальный способ, на то пошло раз уж:
Код AS3:

var _member_isEqual:Function = function( m:Object ):Boolean{
        if(!m)
                return false;
        return Boolean(this.name == m.name && this.manager == m.manager);
}
 
var _member_toString:Function = function():String{
        return "{name:" + this.name + ", manager:" + this.manager + "}";
}
 
var arr:Array = [];
arr.push({name:"one", manager:false, isEqual:_member_isEqual, toString:_member_toString});
arr.push({name:"tru", manager:true,  isEqual:_member_isEqual, toString:_member_toString});
arr.push({name:"fri", manager:false, isEqual:_member_isEqual, toString:_member_toString});
arr.push({name:"one", manager:false, isEqual:_member_isEqual, toString:_member_toString});
arr.push({name:"tru", manager:true,  isEqual:_member_isEqual, toString:_member_toString});
arr.push({name:"fri", manager:false, isEqual:_member_isEqual, toString:_member_toString});
 
trace( "before: \n" + arr.join("\n") );
removeDuplicatesIn( arr );
trace( "after: \n" + arr.join("\n") );
 
function removeDuplicatesIn( array:Array ):void
{
        if( !array || array.length < 1 )
                return;
 
        var i:int = array.length;
        while( i-- > 0 )
        {
                var j:int = i;
                while( j-- > 0 )
                {
                        if( ('isEqual' in array[i] && array[i].isEqual(array[j])) || array[i] == array[j] )
                        {
                                array.splice( i, 1 );
                                break;
                        }
                }
        }
}


kseniya 05.04.2011 17:21

есть же стандартный метод filter, он мне кажется более правильный
Код AS3:

var arr:Array = new Array();
arr.push({name:"one", manager:false});
arr.push({name:"tru", manager:true});
arr.push({name:"fri", manager:false});
arr.push({name:"one", manager:true});
arr.push({name:"tru", manager:true});
arr.push({name:"fri", manager:true});
trace("Employees:");
arr.forEach(traceEmployee);
/*
Employees:
        one
        tru (manager)
        fri
        one (manager)
        tru (manager)
        fri (manager)
*/

var arr2:Array = arr.filter(isManager);
trace("Managers:");
arr2.forEach(traceEmployee);
/*
Managers:
        one
        fri
        one (manager)
        tru (manager)
        fri (manager)
*/

function isManager(element:*, index:int, arr:Array):Boolean {
        for (var i:uint = index+1; i<arr.length; i++){
                if(arr[i]["name"] == element["name"] && arr[i]["manager"] == element["manager"]){
                        return false;
                }
        }
        return true;
}
function traceEmployee(element:*, index:int, arr:Array):void {
        trace("\t" + element.name + ((element.manager) ? " (manager)" : ""));
}


etc 05.04.2011 17:39

Жду когда кто-нибудь напишет вариант с одним единственным циклом.


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

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