Immutable(2) - MoonGyeongHyeon/React_Study GitHub Wiki

React - Immutable.js(2)

List

List๋Š” ๋ฐฐ์—ด ๋Œ€์‹  ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ๊ตฌ์กฐ๋‹ค. Javascript์˜ ๋ฐฐ์—ด๊ณผ ๋™์ผํ•˜๊ฒŒ map, filter, sort, push, pop ๋“ฑ๊ณผ ๊ฐ™์€ ๋‚ด์žฅ ๋ฉ”์†Œ๋“œ๋ฅผ ์ง€์›ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋‚ด์žฅ ๋ฉ”์†Œ๋“œ์˜ ๊ฒฐ๊ณผ๋Š” ํ•ญ์ƒ ์ƒˆ๋กœ์šด List๋ผ๋Š” ๊ฑธ ์žŠ์ง€๋ง์ž. ๋ฆฌ์•กํŠธ์˜ ์ปดํฌ๋„ŒํŠธ๋Š” Immutable์˜ List์™€ ํ˜ธํ™˜์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ map ๋ฉ”์†Œ๋“œ๋กœ ๋ Œ๋”๋งํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์ƒ์„ฑํ•˜๊ธฐ

์ผ๋ฐ˜์ ์ธ ์ƒ์„ฑ ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

var List = Immutable.List;
var list = List([0,1,2,3,4]);

๋งŒ์•ฝ List์˜ ์›์†Œ๊ฐ€ ๊ฐ์ฒด๋ผ๋ฉด Map ํ˜•ํƒœ์˜ ๊ฐ’์„ ๋„ฃ์–ด์ค˜์•ผ ํ•œ๋‹ค.

var List = Immutable.List;
var Map = Immutable.Map;
var fromJS = Immutable.fromJS;

var list = List([
  Map({ value: 1 }),
  Map({ value: 2 })
]);

// or

var list2 = fromJS([
  { value: 1 },
  { value: 2 }
])

Map ํ•จ์ˆ˜ ๋˜๋Š” fromJS ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ List๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

Map๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ List๋„ toJS ๋ฉ”์†Œ๋“œ๋ฅผ ํ†ตํ•ด ์ผ๋ฐ˜ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

  • ๊ฐ’ ์ฝ์–ด์˜ค๊ธฐ

    ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•œ๋‹ค.

    list.get(0);
    // 0 ๋ฒˆ์งธ ์•„์ดํ…œ์„ ์ฝ์–ด์˜จ๋‹ค.
    
    list.getIn([0, 'value']);
    // 0 ๋ฒˆ์งธ ์•„์ดํ…œ์˜ value ์†์„ฑ ๊ฐ’์„ ์ฝ์–ด์˜จ๋‹ค.
    
  • ์•„์ดํ…œ ์ถ”๊ฐ€/์ œ๊ฑฐ/์ˆ˜์ •ํ•˜๊ธฐ

    ์ถ”๊ฐ€๋Š” push ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ๋ฐฐ์—ด์ฒ˜๋Ÿผ ๊ธฐ์กด์˜ ๊ฐ’์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ์ƒˆ๋กœ์šด List๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋Š” ์ œ๊ฑฐ, ์ˆ˜์ •๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค. ์›์†Œ๋ฅผ ๋งจ ์•ž์— ๋„ฃ๊ณ  ์‹ถ๋‹ค๋ฉด unshift ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

    var newList = list.push(Map({ value: 3 }));
    var newList2 = list.unshift(Map({ value: 3 }));
    

    โ€‹

    ์ œ๊ฑฐ๋Š” delete ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค. ์ธ์ž๋กœ index ๊ฐ’์„ ๋„˜๊ธด๋‹ค. ๋งจ ๋’ค์˜ ์›์†Œ๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด pop ์„ ์‚ฌ์šฉํ•œ๋‹ค.

    var newList = list.delete(1);
    var newList2 = list.pop();
    

    โ€‹

    ์ˆ˜์ •์€ setIn ์„ ์‚ฌ์šฉํ•œ๋‹ค. ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” update ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค.

    var newList = list.setIn([0, 'value'], 10);
    // 0๋ฒˆ ์›์†Œ์˜ value ์†์„ฑ ๊ฐ’์„ 10์œผ๋กœ ๋ฐ”๊พผ๋‹ค.
    
    var newList2 = list.update(
    	1,
    	item => item.set('value', item.get('value') * 5)
    );
    // update(index, callback)
    // list ์ค‘ index ๋ฒˆ์งธ ์›์†Œ์—์„œ callback ํ•จ์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.
    // ์ฆ‰, 1๋ฒˆ ์›์†Œ๋ฅผ ์ˆ˜์ •ํ•˜๋Š”๋ฐ, 1๋ฒˆ ์›์†Œ๋ฅผ item์ด๋ผ๋Š” ์ธ์ž๋กœ ๋„˜๊ฒจ callback์„ ์ฒ˜๋ฆฌํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    
  • ํฌ๊ธฐ ๊ฐ€์ ธ์˜ค๊ธฐ

    ํฌ๊ธฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋• size ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋น„์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•  ๋• isEmpty ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

    list.size;
    
    list.isEmpty();