• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dodawanie do tablicy tylko unikalnych obiektów

Object Storage Arubacloud
0 głosów
568 wizyt
pytanie zadane 5 listopada 2015 w JavaScript przez Daniel Siwek Nowicjusz (140 p.)

Witam, mam problem.

Otóż mam obiekt utworzony na podstawie parametrow z funkcji:

 $scope.checkPosRole = function(possition , posRole , posFunction) {
    var rolePos = {pos: possition, posRole: posRole, posFunction: posFunction};	
    $scope.rolePossition.push(rolePos);
  }; 

Problem w tym że chcę aby w tablicy był tylko 1 obiekt z określoną wartością "pos". W przypadku kiedy jest dodawany obiekt z wartoscia "pos" ktora istnieje już w tablicy chcę aby ten obiekt został zamieniony z istniejącym już w tablicy.

Próbowałem już w każdym wywołaniu funkcji przeskanowac tablice foreachem, jednak nie przyniosło mi to porządanego skutku. Prosze o pomoc :(

 

Z góry dziękuję za zainteresowanie,

pozdrawiam

1 odpowiedź

0 głosów
odpowiedź 5 listopada 2015 przez furas Maniak (53,800 p.)
Foreach wydaje się dobrym pomysłem. W jaki sposób sprawdzałeś elemnety ? Może podasz jednak ten kod.

Czy próbowałeś wypisywałeś wartości i obserwować czy przy porównaniu dają wynik `True` ?

Jeśli `pos` jest bardziej złożoną strukturą (np. zawiera pola x i y ) to nie wystarczy porównać

    pos1 == pos2

tylko trzeba porównać

    pos1.x == pos2.x  && pos1.y == pos2.y
komentarz 5 listopada 2015 przez Daniel Siwek Nowicjusz (140 p.)
Nie 'pos' przybiera tylko jedną wartość. Kod z foreachem niestety już wywaliłem, ale coś mi tam nie grało ponieważ pierwszy obiekt dodawało poprawnie, kolejny, inny także, ale przy dodaniu trzeciego obiektu o takiej samej wartości 'pos' jak obiekt drugi, zamieniany zostawał obiekt pierwszy, a nie tak jak to powinno zadziałac czyli obiekt drugi. Kolejne próby dodawania stwarzały jeszcze bardziej dziwne rzeczy, jak dodanie trzeciego obiektu z taka sama wartosćią 'pos'.

Generalnie zasada działana forecha w moim wykonaniu polegała na sprawdzeniu w funkcji każdego elementu tablicy i jeśli obiekt o podanym 'pos' już istnieje to go usuwa i dodaje nowy obiekt zbudowany na podstawie parametrów funkcji. Jeśli nie istnieje to tylko dodaje nowy obiekt. Jednak to właśnie sprawiało anomalie opisane wyżej :/
komentarz 5 listopada 2015 przez furas Maniak (53,800 p.)
Z innych języków wiem, że jednoczesne przeglądanie listy i usuwanie jej elementów może powodować problem bo po usunięciu jednego elementu sprawia, że pozostałe zmieniają swoją pozycję na liście (drugi staje się pierwszym, trzeci staje się drugin, itd.) czego `for/foreach` już nie jest w stanie wychwycić. Kolejne przejście pętli `for` sprawia, że jeden element zostaje przeskoczony. W Pythonie przykładowo w `for` zamiast wyrzucać elementy z listy tworzy się nową listę do której przerzuca się elementami, które mają pozostać - a po zakończeniu `for` nową listę wstawia się w miejsce starej.
komentarz 6 listopada 2015 przez Daniel Siwek Nowicjusz (140 p.)
Ale czy zmiana pozycji powodowałaby problem? W końcu nie dodaję nowego obiektu do konkretnej pozycji, tylko dodaję go na końcu istniejącej tablicy. Faktem jest że innego wyjścia niż iteracja po elementach istniejącej tablicy raczej nie ma, tylko jak poprawnie skonstruować takiego fora lub foreacha. Na chłopski to rozum mój tok myślenia wydaje mi się ok, ale w przełożeniu na kod coś tu jednak nie gra :/
komentarz 7 listopada 2015 przez furas Maniak (53,800 p.)

Wyprodukowałem coś takiego.

Zamiast usuwania i dodawnanie nowego można by ewentualnie podmieniać posRole i posFunction.

 

$scope = {};

$scope.rolePossition = Array();

$scope.checkPosRole = function(possition , posRole , posFunction) {
    var rolePos = {pos: possition, posRole: posRole, posFunction: posFunction}; 

    // szukanie i usuwanie elementu
    for(index = 0; index < $scope.rolePossition.length; ++index) {
    	if($scope.rolePossition[index].pos == possition) {
           $scope.rolePossition.splice(index, 1);
        }
    }

    // dodawanie elementu
    $scope.rolePossition.push(rolePos);
}; 

// wypisywanie na konsole w przegladarce
$scope.print = function() {
	for (index = 0; index < $scope.rolePossition.length; ++index) {
    	console.log($scope.rolePossition[index].pos, $scope.rolePossition[index].posRole, $scope.rolePossition[index].posFunction);
    }
}

$scope.checkPosRole(1,1,1);
$scope.checkPosRole(6,1,1);
$scope.checkPosRole(6,2,2);
$scope.checkPosRole(1,3,3);
$scope.print()

 

komentarz 7 listopada 2015 przez Daniel Siwek Nowicjusz (140 p.)

Udalo mi się osiągnąć oczekiwany efekt. Poniżej podaję rozwiązanie gdyby ktoś w przyszłości potrzebował:

 

	var index = -1;	  

	  for (var i = 0; i < $scope.rolePossition.length; i++) {
	    if($scope.rolePossition[i].pos === rolePos.pos)
	      index = i;
	  }
	  
	if(index > -1) 
	$scope.rolePossition[index] = rolePos;
	else 
	$scope.rolePossition.push(rolePos)

 

Podobne pytania

0 głosów
1 odpowiedź 2,124 wizyt
pytanie zadane 8 września 2016 w Java przez nemezisso Użytkownik (860 p.)
0 głosów
3 odpowiedzi 329 wizyt
0 głosów
2 odpowiedzi 1,249 wizyt
pytanie zadane 17 października 2018 w JavaScript przez smokolisz Mądrala (6,340 p.)

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...