W sierpniu opublikowałem 9 wpisów :
RxJS :
Operator filter
Webstorm :
Jak zlokalizować nieużywany kod w projekcie?
Inne :
Ubuntu: Jak sparować słuchawki Airpods Pro?
JavaScript :
Jak zapobiec zmianie wartości tablicy?
Czym jest czysta funkcja?
Jak stworzyć głęboką kopię zagnieżdżonego obiektu?
Jak pominąć niektóre właściwości obiektu?
Narysowałem dwa komiksy:
Big problem, small steps
"Is task ready?" Driven Development
Przeczytałem cztery książki:
Marsjanin - Andy Weir
Projekt zdrowie - Anders Hansen, Carl Johan Sundberg
Zemsta najlepiej smakuje na zimno - Joe Abercrombie
Legenda o samobójstwie - David Vann
Przesłuchałem cztery audiobooki:
Czarny dom - Stephen King, Peter Straub
Ta druga - Therese Bohman
How to Have a Beautiful Mind - Edward De Bono
Norwegian Wood - Haruki Murakami
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'
}
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.
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...
Nowsze wpisy
Poprzednie wpisy