Frontend/javaScript

[javaScript] 자식 노드 탐색 (재귀)

dddzr 2023. 4. 13. 10:37

기존 tree 라이브러리의 getNodeByKey함수를 사용하던 것을 div로 바꾸면서 만든 특정 key값를 가진 노드를 찾는 함수입니다.

const objArr = [
  { id: 1, name: 'Alice', children: [{ id: 11, name: 'Bob' }] },
  { id: 2, name: 'Charlie', children: [{ id: 21, name: 'Dave' }] }
];
const key = 'Bob';
let node = getNodeByKey(objArr, key);
    
function getNodeByKey(arr, value) {
  let result = null;

  for (let i = 0; i < arr.length; i++) {
    const obj = arr[i];
    if (obj.key  == value) {
      // key를 가진 값을 찾은 경우
      result = obj;
      break;
    } else if (Array.isArray(obj.children)) {
      // 자식 노드가 있는 경우 재귀적으로 탐색
      result = getNodeByKey(obj.children, value);
      if (result != null) {
        break;
      }
    }
  }

  return result;
}

 

만약 key 값이 아니라 특정 속성을 가진 노드를 찾고 싶으면 아래 코드로 찾을 수 있습니다.

const objArr = [
  { id: 1, name: 'Alice', children: [{ id: 11, name: 'Bob' }] },
  { id: 2, name: 'Charlie', children: [{ id: 21, name: 'Dave' }] }
];
const key = 'name';
let node = getNodeByKey(objArr, key);

function findValueByKey(arr, key) {
  let result = null;

  for (let i = 0; i < arr.length; i++) {
    const obj = arr[i];

	if(typeof obj != 'object' ){
    	continue;
    }
    if (obj.hasOwnProperty(key)) {
      // key를 가진 값을 찾은 경우
      result = obj[key];
      break;
    } else if (!Array.isArray(obj)) {
      // 자식 노드가 있는 경우 재귀적으로 탐색
      result = findValueByKey(Object.values(obj), key);
      if (result !== null) {
        break;
      }
    }
  }

  return result;
}