Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 05.04.2011, 15:07
adman вне форума Посмотреть профиль Отправить личное сообщение для adman Найти все сообщения от adman
  № 1  
Ответить с цитированием
adman
 
Аватар для adman

Регистрация: Mar 2011
Адрес: Нижний Новгород
Сообщений: 36
Отправить сообщение для adman с помощью ICQ
Tools удаление дублей из массива

вот нашёл хороший вариант удаление дублей:
Код 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);
}
помогите пожалуйста по удаление дублей

Старый 05.04.2011, 15:21
mayakwd вне форума Посмотреть профиль Отправить личное сообщение для mayakwd Посетить домашнюю страницу mayakwd Найти все сообщения от mayakwd
  № 2  
Ответить с цитированием
mayakwd
 
Аватар для mayakwd

Регистрация: Jul 2008
Адрес: t:2, x: 0.76
Сообщений: 553
Отправить сообщение для mayakwd с помощью ICQ Отправить сообщение для mayakwd с помощью Skype™
Код 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;
}
корявый частный вариант.
__________________
Блог, Twitter
Брюзга.


Последний раз редактировалось mayakwd; 05.04.2011 в 15:25.
Старый 05.04.2011, 15:22
adman вне форума Посмотреть профиль Отправить личное сообщение для adman Найти все сообщения от adman
  № 3  
Ответить с цитированием
adman
 
Аватар для adman

Регистрация: Mar 2011
Адрес: Нижний Новгород
Сообщений: 36
Отправить сообщение для adman с помощью ICQ
вот готовое решение мне помог 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);
}

Старый 05.04.2011, 15:26
mayakwd вне форума Посмотреть профиль Отправить личное сообщение для mayakwd Посетить домашнюю страницу mayakwd Найти все сообщения от mayakwd
  № 4  
Ответить с цитированием
mayakwd
 
Аватар для mayakwd

Регистрация: Jul 2008
Адрес: t:2, x: 0.76
Сообщений: 553
Отправить сообщение для mayakwd с помощью ICQ Отправить сообщение для mayakwd с помощью Skype™
это решение сравнивает только по полю name.
__________________
Блог, Twitter
Брюзга.

Старый 05.04.2011, 15:35
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 5  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Ну я там дальше дополнил

Цитата:
а если по обоим полям, то:
Код AS3:
if (arr[i].name === arr[j].name && arr[i].manager === arr[j].manager)
P.S.
ну мы это уже обсудили =)
__________________
Поймай яблоко 2!

Старый 05.04.2011, 16:11
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 6  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
А мне так больше нравится
Код 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}


Последний раз редактировалось i.o.; 05.04.2011 в 16:16.
Старый 05.04.2011, 16:21
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 7  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
И зачем _member_toString, если ты все равно сравниваешь два поля вручную? )
__________________
Поймай яблоко 2!

Старый 05.04.2011, 16:26
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 8  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
В оутпут выводить чтоб без гемора)
Код 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;
			}
		}
	}
}


Последний раз редактировалось i.o.; 05.04.2011 в 16:37.
Старый 05.04.2011, 17:21
kseniya вне форума Посмотреть профиль Отправить личное сообщение для kseniya Найти все сообщения от kseniya
  № 9  
Ответить с цитированием
kseniya
 
Аватар для kseniya

Регистрация: Oct 2010
Адрес: Новосиб
Сообщений: 122
есть же стандартный метод 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)" : ""));
}

Старый 05.04.2011, 17:39
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 10  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
Жду когда кто-нибудь напишет вариант с одним единственным циклом.

Создать новую тему Ответ Часовой пояс GMT +4, время: 17:13.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
array , массив , удаление переменной
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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