고양이와 코딩

[쏙쏙 들어오는 함수형 코딩] CH14 ~ CH15 본문

함수형 코딩 스터디

[쏙쏙 들어오는 함수형 코딩] CH14 ~ CH15

ovovvvvv 2024. 3. 19. 16:23
728x90

중첩된 데이터에 함수형 도구 사용하기 

앞부분은 생략하고, 최종적으로 만들어진 `updateX` 가 실행되는 과정을 정리해 보자 

function updateX(object, keys, modify) {
  var key1 = keys[0];
  var restOfKeys = drop_first(keys);
  return update(object, key1, function (value1) {
    return updateX(value1, restOfKeys, modify);
  });
}

function update0(value, modify) {
  return modify(value);
}
//updateX()는 일반적으로 nestedUpdate() 라고 부릅니다!
function nestedUpdate(object, keys, modify) {
  if (keys.length === 0) return modify(object);
  var key1 = keys[0];
  var restOfKeys = drop_first(keys);
  return update(object, key1, function (value1) {
    return nestedUpdate(value1, restOfKeys, modify);
  });
}

 

만약 nestedUpdate 함수가 중첩 수준이 3인 경우에 사용된다면 어떻게 작동할까?! (cart > options > size)

  1. nestedUpdate() 함수는 세 개의 인자를 받습니다:
    • object: 대상 객체입니다. 여기서는 cart 객체가 됩니다.
    • keys: 수정할 필드의 경로를 나타내는 배열입니다. 예를 들어, ["options", "size"]와 같이 각 레벨의 필드를 지정합니다.
    • modify: 필드를 수정하기 위한 함수입니다.
  2. 함수 내에서는 먼저 keys 배열의 길이를 확인하여, 만약 keys 배열이 비어 있다면(즉, 더 이상 수정할 필드가 없다면), 주어진 객체에 대해 수정 함수를 적용한 후 반환합니다. 이는 재귀 호출의 종료 조건입니다.
  3. 그렇지 않으면, keys 배열에서 첫 번째 요소를 가져와 key1에 저장합니다. 여기서는 "options"가 됩니다.
  4. 그런 다음 drop_first 함수를 사용하여 keys 배열에서 첫 번째 요소를 제외한 나머지 요소들을 가져옵니다. 이것을 통해 "options"를 제외한 나머지 경로를 restOfKeys 배열에 저장합니다.
  5. 이제 update 함수를 사용하여 object의 key1 필드를 수정합니다. 여기서는 cart 객체의 "options" 필드가 됩니다. 이 때, 수정할 값을 결정하기 위해 해당 필드의 값을 가져와 nestedUpdate 함수를 재귀적으로 호출합니다.
  6. 재귀 호출에서는 value1이 cart 객체의 "options" 필드의 값이 되고, restOfKeys 배열은 "size"가 됩니다. 따라서 다음 단계에서는 "options" 객체의 "size" 필드를 수정하게 됩니다.
  7. 재귀 호출에서 nestedUpdate 함수는 value1인 "options" 객체를 대상으로 하여 modify 함수를 적용하여 해당 필드를 수정합니다.

 

결국 재귀 호출을 사용하는 이유는, 중첩이 길어질 때 필요한 작업을 간편하게 반복하기 위함입니다
따라서 중첩이 6번 되어있는 객체가 있다면 !!

  1. 처음 호출에서 nestedUpdate 함수는 첫 번째 레벨의 필드를 수정하기 위해 호출됩니다. 여기서는 cart 객체의 필드를 수정하려는 것입니다.
  2. 그런 다음 재귀적으로 nestedUpdate 함수가 호출됩니다. 이때는 두 번째 레벨의 필드를 수정하기 위해 호출됩니다. 여기서는 options 필드를 수정하려는 것입니다.
  3. 그 다음에는 세 번째 레벨의 필드를 수정하기 위해 다시 nestedUpdate 함수가 호출됩니다. 여기서는 size 필드를 수정하려는 것입니다.
  4. 이때는 더 이상 중첩된 객체가 없으므로 재귀 호출이 종료됩니다. 수정 함수가 적용되어 해당 필드가 변경됩니다.

이렇게 작동합니다. nestedUpdate에서는 

var restOfKeys = drop_first(keys)

이 부분이 남은 키가 하나 줄어들게 하는 부분입니다 !

 

p.383에 시각화 있음