arrays objects and mutations - Lee-hyuna/33-js-concepts-kr GitHub Wiki
λ°°μ΄κ³Ό κ°μ²΄ κ·Έλ¦¬κ³ λ³μ΄
μλ¬Έ: Arrays, Objects and Mutations
Javascriptμμ λ°°μ΄ λ° κ°μ²΄λ‘ μμ ν λ λΆλ³ν(immutable) λ°μ΄ν° κ΅¬μ‘°μΈ κ² μ²λΌ μ²λ¦¬νμ¬, λ³μ΄λ₯Ό λ§λ λͺκ°μ§ λ°©λ²μ λν΄ μκ°νλ€.
λ³μ΄λ 무μμΈκ°?
λΆλ³μ κ°(imutable value)μ νλ² λ§λ€μ΄ μ§ λ€μμ λ³κ²½μ΄ λμ§ μλ κ°μ λ§νλ€. μλ°μ€ν¬λ¦½νΈμμ μ«μ, λ¬Έμμ΄, λΆλ¦¬μΈκ³Ό κ°μ μμ κ°μ΄λ€μ΄ νμ λΆλ³ μΈ κ°μ΄λ€. κ·Έλ¬λ λ°°μ΄κ³Ό κ°μ²΄ κ°μ λ°μ΄ν°κ΅¬μ‘°λ κ·Έλ μ§ μλ€.
λ³μ΄λ μλ³Έ μμλ₯Ό λ³κ²½νκ±°λ μν₯μ μ£Όλ κ²μ μλ―Ένλ€. μ°λ¦¬μ λͺ©νλ μλ μμλ₯Ό νμ λ³κ²½λμ§ μκ² νλ κ²μ΄λ€.
λ³μ΄λ λΆμμ©μ΄λ€: νλ‘κ·Έλ¨μμ λ³νλ κ²μ΄ μ μμλ‘ μΆμ ν΄μΌ ν κ²μ΄ μ μ΄μ§κΈ° λλ¬Έμ, νλ‘κ·Έλ¨μ΄ λ κ°λ¨ν΄μ§λ€.
μλ³Έ μμμ λν λ³μ΄λ₯Ό λ°μμν€λ λ©μλλ₯Ό βλ‘, λΆλ³ν λ©μλλ β λ‘ νμνλ€.
λ°°μ΄μ μλ‘μ΄ μμ μΆκ°νκΈ°
Array.prototype.push
βArray.prototype.unshift
βArray.prototype.concat
β- Spread Operator (ES6) β
[Array.prototype.push](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/push)
λ λ°°μ΄μ λ§μ§λ§μ μλ‘μ΄ μμλ₯Ό μΆκ°νκ² νλ€. μ΄ λ©μλλ μλ‘μ΄ μ¬λ³Έμ λ°ννμ§ μκ³ , μ μμλ₯Ό μΆκ°νμ¬ μλ λ°°μ΄μ λ³κ²½νκ³ μλ‘μ΄ length
μμ±μ κ°μ§ λ°°μ΄μ λ°ννλ€.
const numbers = [1, 2];
numbers.push(3); // results in numbers being [1, 2, 3]
[Array.prototype.unshift](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/unshift)
λ λ°°μ΄μ μλΆλΆμ μλ‘μ΄ μμλ₯Ό μΆκ°ν λ μ¬μ©νλ€. μ¦ push
, unshift
λ μμ λ λ°°μ΄μ μ 볡μ¬λ³Έμ λ°ννμ§ μκ³ , μλ‘μ΄ length
λ₯Ό κ°μ§ λ°°μ΄μ λ°ννλ€.
const numbers = [2, 3];
numbers.unshift(1); // results in numbers being [1, 2, 3]
μ΄ λ κ°μ§ μμ λ€μ μλμ λ°°μ΄μ λ³κ²½νκ³ μλ€. μλ³Έ λ°°μ΄μ λ³κ²½νμ§ μκ³ μ μ§νλ κ²μ΄ λͺ©νλΌλ μ μ κΈ°μ΅ν΄λΌ. μλ³Έμ λ³κ²½νμ§ μκ³ λ°°μ΄μ μ μμλ₯Ό μΆκ°νλ λͺ κ°μ§ λμμ μ΄ν΄λ³΄μ.
μλ§λ κ°μ₯ μ¬μ΄ λ°©λ²μ μλμ κ°μ΄ μλ³Έ λ°°μ΄μ 볡μ¬λ³Έμ μμ±νκ³ μ§μ μΆκ°νλ κ²μΌ κ²μ΄λ€.
const numbers = [1, 2];
const moreNumbers = numbers.slice();
moreNumbers.push(3);
μ°λ¦¬λ μ΄κ²μ "ν΅μ λ λ³μ΄"λΌκ³ λΆλ₯Ό μ μμ κ²μ΄λ€. μλ³Έμ΄ μλ 볡μ¬λ³Έμ κ°μ§κ³ μ€μ λ‘ λ°°μ΄μ λ³μ΄λ₯Ό νκ³ μκΈ° λλ¬Έμ΄λ€.
κ·Έλ¬λ [Array.prototype.slice](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/slice)
λ μλ³Έ λ°°μ΄μ κΉμ 볡μ¬λ³Έμ μμ±νμ§ μκΈ° λλ¬Έμ κΉλ€λ‘μΈ μ μλ€.
[Array.prototype.concat](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/concat)
μ μ€μ λ‘ μλ‘μ΄ λ°°μ΄μ λ°ννλλ°, μ΄κ²μ΄ μ°λ¦¬κ° μνλ κ²μ΄λ€. μ΄ λ©μλλ₯Ό μ¬μ©νμ¬ μλ³Έμ μλ‘μ΄ μμκ° μΆκ°λ μ λ°°μ΄μ λ°νν μ μλ€. μλλ₯Ό 보μ:
const numbers = [1, 2];
const moreNumbers = numbers.concat([3]);
slice
μ κ·Έλ¬λ―μ΄, concat
λ μλ³Έ λ°°μ΄μ μμ 볡μ¬λ³Έμ λ°ννλ€. μ΄κ²μ κ°μ²΄μ λ°°μ΄ λͺ¨λμ λν μ°Έμ‘°λ§ λ³΅μ¬νλ€λ κ²μ μλ―Ένλ€. μ¨μ ν μλ‘μ΄ λ°°μ΄μ 볡μ¬λ³Έμ λ°νλ°κΈΈ μνλ€λ©΄, Lodashμ [cloneDeep](https://lodash.com/docs/#cloneDeep)
λ₯Ό μ΄μ©νλ κ²μ κ³ λ €ν΄λ³΄μ. 맀κ°λ³μλ‘ μ λ¬λ λ°°μ΄κ³Ό κ°μ²΄λ₯Ό μ¬κ·μ μΌλ‘ 볡μ νλ€.
const people = [{ name: 'Bob' }, { name: 'Alice' }];
const morePeople = cloneDeep(people).concat([{ name: 'John' }]);
console.log(people[0] === morePeople[0]); // returns false
μμ λ³΅μ¬ vs κΉμ 볡μ¬λ μ΄ κΈ μ 체μ λνλλ λ°λ³΅μ μΈ μ£Όμ μ΄λ€. μλ³Έ λ°°μ΄μ μμκ° λ°°μ΄μ΄κ±°λ κ°μ²΄μ΄κ³ , μ΄λ₯Ό μλ³Έ κ·Έλλ‘ μ μ§ν΄μΌνλ κ²½μ° νμ cloneDeep
μ μ¬μ©ν΄λΌ. κ·Έλ¬λ κΉμ 볡μ¬λ μ±λ₯ λ©΄μμ λΉμ©μ΄ λ§μ΄ λλ μμ
μ΄λΌλ κ²μ λͺ
μ¬νλΌ. μλ§ νμ κΉμ 볡μ¬λ³Έμ νμλ‘ νλ κ²μ μλ κ²μ΄λ€. μ¬μ€, κ°λ₯νν κΉμ 볡μ¬λ³Έμ λ§λλ κ²μ νΌν΄μΌνλ€. μ λ§ νμνκ³ μ¬μ©ν΄μΌνλ€λ©΄, μ΄μ¨λ°°λ°(tradeoffs)μ μκ³ μμ΄μΌνλ€.
λ°°μ΄μ μλ‘μ΄ μμλ₯Ό λ°°μ΄μ λ³κ²½μμ΄ μΆκ°νλ λ°©λ²μΌλ‘ λ€μ λμκ°μ, ES6 μ΄ν μ¬μ© κ°λ₯ν spread operatorλ₯Ό concat
λμ μ μ¬μ©ν μ μλ€.
const numbers = [1, 2];
const moreNumbers = [...numbers, 3];
μ§κΈκΉμ§ λ°°μ΄μ 맨 μ²μμ΄λ 맨 λμ μμλ₯Ό μΆκ°νμ§λ§, [Array.prototype.splice](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/splice)
λ₯Ό μ¬μ©νλ©΄ λ°°μ΄μ μ΄λ μμΉμλ μμλ₯Ό μΆκ°ν μ μλ€. splice
λ μλ³Έ λ°°μ΄μ λ³κ²½νλ λͺ
μ¬νλΌ.
const positions = ['First', 'Second', 'Fifth', 'Sixth', 'Seventh'];
positions.splice(2, 0, 'Third', 'Fourth');
μμ μμ μμ, λλ²μ§Έ 맀κ°λ³μ(0
)μ μλ―Έλ "μ무κ²λ μ κ±°νμ§ λ§ κ²"μ΄λ€.
λν, μ°λ¦¬λ concat
μ μ¬μ©νμ¬ μλ λ°°μ΄μ λ³κ²½νμ§ μκ³ λ λμΌν κ²°κ³Όλ₯Ό μ»μ μ μλ€.
const positions = ['First', 'Second', 'Fifth', 'Sixth', 'Seventh'];
const morePositions = positions
.slice(0, 2)
.concat(['Third', 'Fourth'])
.concat(positions.slice(2));
λλΈμ΄ spread operatorsλ‘λ μ΄ μμ μ ν μ μλ€.
const positions = ['First', 'Second', 'Fifth', 'Sixth', 'Seventh'];
const morePositions = [
...positions.slice(0, 2),
'Third',
'Fourth',
...positions.slice(2)
];
κ°μ²΄μ μλ‘μ΄ μμ± μΆκ°νκΈ°
- μ§μ μΆκ°νκΈ° β
Object.assign
(ES6) β- Object spread operator (μμ§ νμ€μ΄ μλ μ€νμ μΈ κΈ°λ₯) β
μ°λ¦¬λ μμ±μ μ§μ μ€μ ν¨μΌλ‘μ¨ μ½κ² μλ‘μ΄ μμ±μ μΆκ°ν μ μλ€. λ¬Όλ‘ μ΄κ²μ μλ κ°μ²΄μ λν λ³μ΄λ₯Ό μΌμΌν¨λ€.
const person = { name: 'John Doe', email: '[email protected]' };// Using dot notation
person.age = 27;// Using array notation
person['nationality'] = 'Irish';
μλ§ μλ³Έ κ°μ²΄λ₯Ό λ³κ²½νμ§ μκ³ μλ‘μ΄ μμ±μ μΆκ°νλ κ°μ₯ κ΄λ²μν ν΄κ²°λ°©λ²μ [Object.assign](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
λλ Lodashμ [assign](https://lodash.com/docs/#assign)
μ μ¬μ©νλ κ²μΌ μ μλ€.
const person = { name: 'John Doe', email: '[email protected]' };
const samePerson = Object.assign({}, person, {
age: 27,
nationality: 'Irish'
});
Object.assign
μ λν μ°Έκ³ : 첫 λ²μ§Έ μΈμκ° λΉ κ°μ²΄μΈ κ²μ νμΈν΄λ³΄λΌ. Object.assign
μ μ λ¬ν 첫λ²μ§Έ 맀κ°λ³μλ₯Ό λ³νμν¨λ€. μ΄ μ°μ°μμ μν΄ person
μ΄ μμ λλ κ²μ μμΉ μκΈ° λλ¬Έμ, 첫 λ²μ§Έ μΈμλ‘ person
μ΄ μλ {}
μ μ λ¬νλ κ²μ΄λ€. μλ³Έ κ°μ²΄λ₯Ό λ³νμν€μ§ μκ³ μ μ§νλ €λ©΄ νμ λΉ κ°μ²΄λ₯Ό 첫 λ²μ§Έ λ§€κ° λ³μλ‘ μ λ¬νλΌ.
λ°°μ΄κ³Ό κ²κ³Ό λ§μ°¬κ°μ§λ‘, μμ§ νμ€μ΄ μλ object spread operator
λ₯Ό μ¬μ©ν μ μλ€. object spread operatorλ κ°λ
μ μΌλ‘ ES6μ array spread operatorμ μ μ¬νλ€.
const person = { name: 'John Doe', email: '[email protected]' };
const samePerson = { ...person, age: 27, nationality: 'Irish' };
λ°°μ΄μμ μμ μ κ±°νκΈ°
Array.prototype.splice
βArray.prototype.pop
βArray.prototype.shift
βArray.prototype.slice
&Array.prototype.concat
βArray.prototype.slice
& the ES6 Spread Operator βArray.prototype.filter
β
[Array.prototype.splice(index, number)](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/splice)
λ index
μμ μμνμ¬ number
κ°―μλ§νΌ μμλ₯Ό μ κ±°νλ€. κ·Έλ¦¬κ³ μ κ±°λ μμμ λ°°μ΄μ λ°ννλ€.
const cities = ['Oslo', 'Rome', 'Cork', 'Paris', 'London', 'Bern'];
cities.splice(2, 1); // removes 1 element from the 2nd index (Cork)
[Array.prototype.pop](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/pop)
λ λ°°μ΄μ λ§μ§λ§ μμλ₯Ό μ κ±°νλλ° μ¬μ©νλ€. λν μ κ±°λ μμλ₯Ό λ°ννλ€. Array.prototype.push
μ μ ν¨μμ΄λ€.
const cities = ['Oslo', 'Rome', 'Cork', 'Paris', 'London', 'Bern'];
const bern = cities.pop(); // removes Bern from the list of cities
λ°°μ΄μ 첫 λ²μ§Έ μμλ₯Ό μ κ±°νκ³ λ°ννλ [Array.prototype.shift](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/shift)
λ μλ€. μ΄λ Array.prototype.unshift
μ μκΈ°λ₯μ΄λ€.
const cities = ['Oslo', 'Rome', 'Cork', 'Paris', 'London', 'Bern'];
const oslo = cities.shift(); // removes Oslo from the list of cities
splice
, pop
κ·Έλ¦¬κ³ shift
λͺ¨λ μλ³Έ λ°°μ΄μ λ³νμν¨λ€. μ΄μ μλ³Έ λ°°μ΄μ λ³μ΄ μν€μ§ μλ λͺκ°μ§ λ°©λ²μ μ΄ν΄λ³΄μ.
μμ μμ λμ λ°°μ΄μμ Corkλ₯Ό μ κ±°νλ€κ³ κ°μ νμ. μ΄λ₯Ό λ¬μ±νκΈ° μν΄ μ°λ¦¬λ slice
μ concat
μ μ‘°ν©μ μ¬μ©νμ¬ μλ³Έ λ°°μ΄μ μ¬λΌμ΄μ€ μ¬λ³Έμ λ§λ λ€μ(μ²μλΆν° λ λ²μ§Έ μμκΉμ§ ν¬ν¨νμ§ μμ) μλ³Έ λ°°μ΄μ λ€λ₯Έ μΈ λ²μ§Έ μμΉμμλΆν° μΈ λ²μ§Έ μμΉκΉμ§ μ¬λΌμ΄μ€μ μ°κ²°νλ©΄ λλ€. μ΄λ κ² ν΄μ λ λ²μ§Έ μΈμμ μμΉν μμ(Cork)λ₯Ό μ κ±°νλ€.
const cities = ['Oslo', 'Rome', 'Cork', 'Paris', 'London', 'Bern'];
const capitals = cities
.slice(0, 2)
.concat(cities.slice(3));
λκ°μ κ²°κ³Όλ₯Ό spread operatorλ₯Ό μ¬μ©νμ¬ μ»μ μ μλ€.
const cities = ['Oslo', 'Rome', 'Cork', 'Paris', 'London', 'Bern'];
const capitals = [
...cities.slice(0, 2),
...cities.slice(3)
];
[Array.prototype.filter](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)
λ₯Ό μ¬μ©νμ¬ μ κ±°νλ €λ μμλ₯Ό νν°λ§ ν μ μλ€. μ΄ λ©μλλ μλ‘μ΄ λ°°μ΄μ λ°ννλ€.
const cities = ['Oslo', 'Rome', 'Cork', 'Paris', 'London', 'Bern'];
const capitals = cities.filter(city => city !== 'Cork');
μΈλ±μ€λ‘ μμλ₯Ό νν°λ§ν μ μλ€.
const cities = ['Oslo', 'Rome', 'Cork', 'Paris', 'London', 'Bern'];
const capitals = cities.filter((city, index) => index !== 2);
κ°μ²΄μμ μμ± μ κ±°νκΈ°
delete
μ°μ°μ β- Object destructuring β
- Lodashβs
pick
andomit
β
delete
μ°μ°μλ₯Ό μ¬μ©νμ¬ κ°μ²΄μμ μμ±μ μ κ±°ν μ μλ€. λ¬Όλ‘ μλ³Έ κ°μ²΄μ λ³μ΄λ₯Ό μΌμΌν¨λ€.
const person = { name: 'John Doe', email: '[email protected]', age: 27 };
// dot notation
delete person.age;
// array notation
delete person['age'];
λ³μ΄λ₯Ό νΌνκΈ° μν΄ ES6μ sperad operatorλ₯Ό μ¬μ©νλ©΄ λλ€. (object destructuring)
const person = {
name: 'John Doe',
email: '[email protected]',
age: 27,
country: 'Australia',
language: 'English',
profession: 'Front End Developer'
};
const { profession, country, ...newPerson } = person;
console.log(newPerson);
profession
κ³Ό country
κ° μ κ°μ²΄μμ μ κ±°λλ€.
λν Lodashμ [pick](https://lodash.com/docs/#pick)
μ [omit](https://lodash.com/docs/#omit)
λ₯Ό μ΄μ©ν μ μλ€. 첫 λ²μ§Έ μΈμλ μμ
ν κ°μ²΄μ΄κ³ , λ λ²μ§Έ μΈμλ λ¬Έμμ΄ λλ μ κ±°νλ €λ μμ±μ λ¬Έμμ΄ λ°°μ΄ μΌ μ μλ€. λ λ€ μλ‘μ΄ κ°μ²΄λ₯Ό λ°ννλ€.
const person = { name: 'John Doe', email: '[email protected]', age: 27 };
const fewerDetails = _.omit(person, 'age');// or we could use pick which is the inverse of omit
const fewerDetails = _.pick(person, ['name', 'email']);
κ²°λ‘
- λ³μ΄κ° νμ©λμ§ μλ μν©(μ:리λμ€ reducers)μ΄ μ‘΄μ¬νμ§λ§, λ§μ λ€λ₯Έ κ²½μ°μλ λ¬Έμ κ° μλ€. μ΄κ²μ΄ κ΄μ°°κ°λ₯νκ±°λ κ΄μ°°λΆκ°λ₯ν λ³μ΄λ₯Ό ꡬλ³νλ κ²μ΄ νμμ μΈ μ΄μ μ΄λ€. ν¨μμ κ°μ²΄λ₯Ό λ§λ λ€μ κ·Έ κ°μ²΄λ₯Ό μ±μΈ νμκ° μλ€λ©΄, λ§€μ° λΉν¨μ¨μ μΌλΏ μλλΌ λ³μ΄λ₯Ό νΌνκΈ°μ μ리νμ§ μλ€. μ΄ μ€λ λ λ μ£Όμ μ λν μ’μ κΈμ΄λ€.
- spread operator,
Array.prototype.concat
,Array.prototype.slice
, κΈ°ν λ±λ±μ κΈ°μ΅νλΌ. μ΄ κ²λ€μ λͺ¨λ λ°°μ΄μ μμ 볡μ¬λ³Έμ λ°ννλ€. λ§μ½ κΉμ 볡μ¬λ₯Ό μνλ€λ©΄ LodashμcloneDeep
μ μ¬μ©νλΌ - λν μλ³Έ λ°°μ΄μ λ³κ²½νλ λμ μ λ°°μ΄ / κ°μ²΄λ₯Ό λ°ννλ©΄ μ±λ₯ μΈ‘λ©΄μμ λΉμ©μ΄ λ§μ΄ λ λ€. (νΉν κΉμ 볡μ¬) λ°μ΄ν° ꡬ쑰λ₯Ό λΆλ³μΌλ‘ μ μ§νλ κ²μ λΉμ©μ΄ λ§μ΄λλ μμ μ΄λ€.