Opublikowano:
30.08.2022 - tagi:
Załóżmy, że mamy obiekt jak poniżej:
{
name : 'Some product' ,
price : 100 ,
currency : 'PLN' ,
weight : 1.5 ,
size : 'L'
}
I chcielibyśmy pobrać większość właściwości tego obiektu, ale pozbyć się niektórych. Na przykład chcemy pominąć: weight i size . Jak rozwiązać ten problem?
Możemy użyć operatora spread : ... . Przykład
const obj = {
name : 'Some product' ,
price : 100 ,
currency : 'PLN' ,
weight : 1.5 ,
size : 'L'
};
const { weight, size, ...newObj } = obj;
console .log (newObj);
Wynik:
{
name : 'Some product' ,
price : 100 ,
currency : 'PLN'
}
Opublikowano:
23.08.2022 - tagi:
Opublikowano:
18.08.2022 - tagi:
Kopiowanie obiektu Stworzenie kopii obiekt jest proste:
const originalObj = {
title : 'Foo' ,
value : 100 ,
tags : ['a' , 'b' , 'c' ]
};
const copyObj = {
...originalObj
};
copyObj.title = 'Bar' ;
copyObj.value = 50 ;
copyObj.tags .push ('d' );
console .log ('originalObj: ' , originalObj);
console .log ('copyObj: ' , copyObj);
Za pomocą operatora spread : ... tworzymy kopię obiektu. Następnie zmieniamy w skopiowanym obiekcie jego parametry. Oryginał się nie zmieniał. I tak miało być :)
Niestety to nie zadziała dla obiektu zagnieżdżonego.
Kopiowanie obiektu zagnieżdżonego Najpierw przykład:
const originalObj = {
name : 'Janusz Kowalski' ,
age : 57 ,
address : {
city : 'New York' ,
street : '99 East Golf Street'
}
};
const copyObj = {
...originalObj
};
copyObj.name = 'Grażyna Kowalska' ;
copyObj.address .city = 'Chicago' ;
copyObj.address .street = '3109 15th St' ;
console .log ('originalObj: ' , originalObj);
console .log ('copyObj: ' , copyObj);
Kopia została stworzona, ale nie dla zagnieżdżonej części obiektu jak: address . Po zmianie danych w kopii zmieniły się też dane w oryginale!
Jak sobie z tym poradzić?
const originalObj = {
name : 'Janusz Kowalski' ,
age : 57 ,
address : {
city : 'New York' ,
street : '99 East Golf Street'
}
};
const copyObj = JSON .parse (JSON .stringify (originalObj))
copyObj.name = 'Grażyna Kowalska' ;
copyObj.address .city = 'Chicago' ;
copyObj.address .street = '3109 15th St' ;
console .log ('originalObj: ' , originalObj);
console .log ('copyObj: ' , copyObj);
Kombinacja: JSON.parse i JSON.stringify rozwiązuje ten problem.
To rozwiązanie nie zadziała jeśli obiekt zawiera funkcje. Funkcje nie zostaną skopiowane.
Opublikowano:
16.08.2022 - tagi:
Czym to jest czysta funkcja? Czysta funkcja (ang.: pure function ) jest to termin z programowania funkcjonalnego, który mówi, że funkcja jest "czysta" jeśli są spełnione następujące warunki:
Te same dane przekazane do funkcji zawsze dają taki sam wynik. Funkcja nie tworzy efektów ubocznych. Przyjrzyjmy się obu warunkom bliżej.
Dane na wejściu, wynik na wyjściu Te same dane przekazane do funkcji zawsze dają taki sam wynik.
Czyli: dla taki samych parametrów funkcja zawsze powinna zwrócić ten sam wynik:
const multiply = (num, by ) => num * by;
console .log (multiply (2 , 3 ));
console .log (multiply (2 , 4 ));
console .log (multiply (2 , 3 ));
Podajemy dwa razy te same parametry: 2 i 3 i dostajemy ten sam wynik: 6 . To jest czysta funkcja.
Inny przykład:
console .log (Math .random ());
console .log (Math .random ());
console .log (Math .random ());
To nie jest czysta funkcja! Dla tych samych danych wejściowych dostajemy różne wyniki. Pierwszy warunek nie został spełniony w tym przypadku.
Efekty uboczne Funkcja nie tworzy efektów ubocznych.
To znaczy, że czysta funkcja nie zmienia stanu danych do niej przekazanych.
Przykład 1 const setProperty = (property, value, object ) => {
object[property] = value;
}
const obj = { name : 'Object' };
setProperty ('size' , 100 , obj);
console .log (obj);
Funkcja setProperty nie można nazwać czystą, ponieważ tworzy efekt uboczny. Zmienia stan obiektu, który jest przekazany do funkcji.
Poprawiona wersja:
const setProperty = (property, value, object ) => {
return ({
...object,
[property]: value
});
}
const obj = { name : 'Object' };
const updatedObject = setProperty ('size' , 100 , obj);
console .log (obj);
console .log (updatedObject);
Przykład 2 Czysta funkcja nie polega na stanie z zewnątrz:
const counterValue = 10 ;
const updateCounter = (value ) => value + counterValue;
console .log (updateCounter (5 ));
console .log (updateCounter (10 ));
console .log (updateCounter (10 ));
Tutaj niby wszystko jest ok. Daje takie same wyniki na przykład dla parametru 10 . Problem jest taki, że działamy na zmiennej z zewnątrz .
A co jeśli zmienimy nieco kod:
let counterValue = 10 ;
const updateCounter = (value ) => value + counterValue;
console .log (updateCounter (5 ));
console .log (updateCounter (10 ));
counterValue += 15 ;
console .log (updateCounter (10 ));
Ups... mamy już inne wyniki...
Opublikowano:
11.08.2022 - tagi:
Kopiowanie tablicy Załóżmy, że mam taki przykład:
const original = [1 , 2 , 3 , 4 , 5 ];
const copy = original;
copy[0 ] = 7 ;
console .log ('original: ' , original);
console .log ('copy: ' , copy);
Stworzyliśmy kopię tablicy, a następnie zmieniliśmy jej pierwszy element. Niestety zmienił się także oryginał. Jest tak dlatego, że w ten sposób skopiowaliśmy także referencje z macierzystej tablicy.
Jak temu zapobiec?
Operator spread: ... const original = [1 , 2 , 3 , 4 , 5 ];
const copyArray = [...original];
copyArray[0 ] = 7 ;
console .log ('original: ' , original);
console .log ('copyArray: ' , copyArray);
Funkcja slice const original = [1 , 2 , 3 , 4 , 5 ];
const copyArray = original.slice ();
copyArray[0 ] = 7 ;
console .log ('original: ' , original);
console .log ('copyArray: ' , copyArray);
Funkcja concat const original = [1 , 2 , 3 , 4 , 5 ];
const copyArray = [].concat (original);
copyArray[0 ] = 7 ;
console .log ('original: ' , original);
console .log ('copyArray: ' , copyArray);
Jak zapobiec zmianie w tablicy? Jeśli zależy nam na stworzeniu tablicy, której zawartości nie chcemy zmieniać w ogóle, możemy użyć: Object.freeze . Pisałem już o niej w tym wpisie.
Przykład:
const array = Object .freeze ([1 , 2 , 3 ]);
array[0 ] = 7 ;
array.push (12 );
array.pop ();
Jak widać każda próba modyfikacji tablicy, powoduje błąd w kodzie.
Nowsze wpisy Poprzednie wpisy