Javascript Equals e Array que não suporta itens repetidos (javascript e Programação Orientada a Objetos (POO))

No Java, a característica das coleções que implementam a interface Set (java.util.Set) é que elas não aceitam itens repetidos e para realizar esta comparação internamente elas utilizam-se do método ‘equals()’ e ‘hashcode()’ dos objetos em questão.

Abaixo tentei simular esta mesma característica em Javascript. Para tanto, foi necessário estender o prototype de Array adicionando um novo método a este objeto chamado ‘addItem()’. Este método faz uso de outra função declarada no escopo global chamada … ‘equals()’ para decidir se vai adicionar um novo item ou se vai substituir.

Veja o código sendo executado: http://jsfiddle.net/pedroabs/kdkaj/

Segue o código abaixo !

<html>
	<header>
		<script type="text/javascript">
			var arr = new Array();

			Array.prototype.addItem = function(newItem){
				if(this.length == 0){
					this[0] = newItem;
					return;
				}

				function equals(other){
					if(this.nome == other.nome) return true;
					return false;
				}

				for(var i = 0, max = this.length; i < max; i++){
					var item = this[i];
					var isEquals = equals.call(item, newItem);

					if(isEquals) {
						this[i] = newItem;
						return;
					}
				}

				this[this.length] = newItem;

			};

			arr.addItem({nome:"pedro", obs:""});
			arr.addItem({nome:"henrique", obs:""});
			arr.addItem({nome:"lorena", obs:""});
			arr.addItem({nome:"juliane", obs:""});

			// repetidos substituem os já existentes
			arr.addItem({nome:"juliane", obs:"repetido"});
			arr.addItem({nome:"henrique", obs:"repetido"});

			// item inédito
			arr.addItem({nome:"lucia", obs:"item inédito"});

			window.onload = function(){

				var pedro = new Object();
				pedro.nome = "pedro";
				pedro.obs = "novo pedro";

				var tania = new Object();
				tania.nome = "tania";
				tania.obs = "nova tania";

				arr.addItem(pedro);
				arr.addItem(tania);

				for(var i = 0;i<arr.length;i++){
					var item = arr[i];
					item.toString = function(){
						return this.nome + " [" +this.obs + "]";
					}

					document.write(item+"<br>");
				}
			}
		</script>
	</header>
	<body>
	</body>
</html>


Anúncios
Esta entrada foi publicada em Javascript e AJAX com as etiquetas , . ligação permanente.

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s