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

javascript obiekt

VPS Starter Arubacloud
0 głosów
278 wizyt
pytanie zadane 29 lipca 2020 w JavaScript przez rob Bywalec (2,440 p.)

Nie umiem aktualizować stanu, mój obiekt trafia obok, kombinuję jak koń pod górę

tak wygląda screen 

a taki jest kod który umieszcza ten obiekt

 return {
                ...state,
                todos: [...todo, { titleMarked: true }]

            };

chodzi o obiekt  { titleMarked: true }

jak się spojrzy na screen to jest tam array    todos    z dwoma obiektami  pierwszy jest tym własciwym a drugi jest 

{ titleMarked: true } który powyższy kod tam go umieszcza, zamiast aktualizować stanu w pierwszym obiekcie- tam też jest obiekt  tyle że false{ titleMarked: false } i on miałby być zamieniony, kombinuję ale nie potrafię tego zrobić.

Ktoś wie jak?

2 odpowiedzi

+1 głos
odpowiedź 29 lipca 2020 przez ScriptyChris Mędrzec (190,190 p.)
wybrane 30 lipca 2020 przez rob
 
Najlepsza

Zamiast przypisywać do todos tablicę, to przypisz obiekt, w którym wypakujesz obiekt todo i nadpiszesz property titleMarked z wartością true.

return {
  ...state,
  todos: {
    ...todo,
    titleMarked: true
  }
};

Jeśli todos ma być tablicą, to dodatkowo owiń przypisany do niej obiekt w tablicę.

komentarz 29 lipca 2020 przez rob Bywalec (2,440 p.)

todos to tablica w której może być dużo obiektów, a todo to jeden wybrany obiekt z tej tablicy więc chyba musi być w tablicy? tak czy inaczej nie ma to znaczenia, bo w tym komponencie muszę zmienić titleMarked na wartość true w jednym wybranym obiekcie, natomiast w komponencie List i tak muszę znaleźć sposób na zmianę titleMarked na wartość true  na być może wielu obiektach w tablicy... ale nie wszystkich

komentarz 29 lipca 2020 przez ScriptyChris Mędrzec (190,190 p.)

W powyższym kodzie todo jest tablicą, a to czy zawiera jeden czy więcej obiektów, zależy od tego ile elementów pozytywnie przejdzie przez filtrowanie. Jeśli do property todos chcesz przypisać jeden obiekt (nazywając go todo), to jak wspomniałem wyciągnij go najpierw z tablicy (użyj state.todos.find zamiast state.todos.filter, albo przypisz zmiennej todo obiekt z pierwszego elementu przefiltrowanej tablicy todos) i wtedy dopiero rozpakowanie todo będzie działać zgodnie z oczekiwaniami.

Czyli jedno z dwóch:

const todo = state.todos.find((todo) => {
    // ... 
});

// albo

const filteredTodos = state.todos.filter((todo) => {
    // ... 
});
const todo = filteredTodos[0];

 

komentarz 30 lipca 2020 przez rob Bywalec (2,440 p.)

zrobiłem to tak i działa, dzięki wielkie za podpowiedź, co o tym myślisz?

  case 'CHANGE_TITLE_TASK':
            function findTodo(todo) {
                return todo = action.id
            }
            const todo = state.todos.find((findTodo) => {
                return findTodo
            })
            return {
                ...state,
                todos: [{ ...todo, titleMarked: !todo.titleMarked }]
            };

ale mam podobny następny problem i ten nie działa

taki jest kod

case 'CHANGE_TITLE_LIST':
            console.log(action.id);
            function findTodoList(todoList) {
                return todoList = action.id
            }
            const todoList = state.todos.find((findTodoList) => {
                return findTodoList
            })


            console.log(todoList);
            console.log(...state.todos);
            console.log(state);
            return {
                ...state,
                todos: [...state.todos, { ...todoList, titleMarked: !todoList.titleMarked }],




            }

a taki scren, po prostu albo dodaje cały obiekt jako 3 pozycję albo titleMarked: true jako trzeci obiekt....

dla mnie najtrudniej jest zmieniać włąsnie stan, mógłbyś polecić jakiś art lub coś podobnego?

komentarz 30 lipca 2020 przez ScriptyChris Mędrzec (190,190 p.)
edycja 30 lipca 2020 przez ScriptyChris
function findTodo(todo) {
  return todo = action.id
}
const todo = state.todos.find((findTodo) => {
  return findTodo
})

To raczej nie jest to co chcesz robić - callback metody find dostaje w pierwszym argumencie (nie ważne jak go nazwiesz) kolejne elementy tablicy, a zwrócony będzie pierwszy element, dla którego callback zwróci wartość truthy  który będzie truthy. W Twoim kodzie tablica zawiera obiekty. Te z kolei zawsze są truthy, w związku z tym metoda find zwróci pierwszy obiekt z tablicy, ale bez względu na warunek, który założyłeś w funkcji findTodo - ona tutaj nawet nie jest wywołana, ponieważ zmienne lokalne przysłaniają zmienne z wyższych scope'ów. Po drugie, w funkcji findTodo nie sprawdzasz, czy zmienna todo jest równa property action.id, lecz robisz przypisanie.

Prawidłowo to powinno wyglądać tak:

const todo = state.todos.find((todoItem) => {
  return todoItem === action.id;
})

Ewentualnie w wersji z przekazaniem callbacka przez referencję:

function findTodo(todo) {
  return todo === action.id;
}
const todo = state.todos.find(findTodo);

 

komentarz 30 lipca 2020 przez rob Bywalec (2,440 p.)
dzięki bardzo
+2 głosów
odpowiedź 29 lipca 2020 przez Comandeer Guru (599,730 p.)

Bo musisz użyć składni spread w obiekcie, obecnie go używasz w tablicy:

return {
               ...state,
               todos: [ { ...todo, titleMarked: true }]
 
           };

 

Podobne pytania

0 głosów
1 odpowiedź 108 wizyt
pytanie zadane 28 lipca 2020 w JavaScript przez rob Bywalec (2,440 p.)
0 głosów
1 odpowiedź 117 wizyt
pytanie zadane 23 lipca 2020 w JavaScript przez rob Bywalec (2,440 p.)
+1 głos
1 odpowiedź 126 wizyt
pytanie zadane 25 czerwca 2020 w JavaScript przez marcinszary Nowicjusz (150 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...