홈>
요소 목록이 있으며 각 요소에는 ID와 부모 ID가 있습니다. 내가 원하는 것은이 '계층 구조'에 루프가 있는지 감지하고 루프를 시작하는 ID를 표시하는 것입니다.
list = [
{
id: '1',
parent: '2'
},
{
id: '2',
parent: '3'
},
{
id: '3',
parent: '4'
},
{
//This id is causing the loop
id: '4',
parent: '1'
}
]
루프가 없을 때 작동하지만 루프에서는 작동하지 않는 트리를 빌드하려고 시도했습니다.
function treeify(list, idAttr, parentAttr, childrenAttr) {
if (!idAttr) idAttr = 'id';
if (!parentAttr) parentAttr = 'parent';
if (!childrenAttr) childrenAttr = 'children';
var treeList = [];
var lookup = {};
list.forEach(function(obj) {
lookup[obj[idAttr]] = obj;
obj[childrenAttr] = [];
});
list.forEach(function(obj) {
if (obj[parentAttr] != null) {
lookup[obj[parentAttr]][childrenAttr].push(obj);
} else {
treeList.push(obj);
}
});
return treeList;
};
루프가있을 때도 감지 할 수 없습니다.
루프가 뒤에있는 데이터를 수정하게하는 요소의 ID를 반환하고 싶습니다.
- 답변 # 1
- 답변 # 2
모두 수집 할 수 있습니다 방문한 노드를 가져 와서 모든 노드를 필터링하고 필터링합니다.
무한 배열은 순환 참조를 일으키는 모든 노드를 포함합니다.function isCircular(id, visited = []) { return visited.includes(id) || Object.keys(links[id]).some(k => isCircular(k, visited.concat(id))); } var list = [{ id: '1', parent: '2' }, { id: '2', parent: '3' }, { id: '3', parent: '4' }, { id: '4', parent: '1' }], links = {}, infinite = []; list.forEach(({ id, parent }) => { links[parent] = links[parent] || {}; links[parent][id] = true; }); infinite = list.filter(({ id }) => isCircular(id)); console.log(links); console.log(infinite);
.as-console-wrapper { max-height: 100% !important; top: 0; }
관련 자료
- 자바 스크립트에서 요소 ID를 어떻게 설정할 수 있습니까?
- jquery - for 루프 JavaScript에서 div 요소 ID를 생성하는 방법
- 일부 요소가 포함 된 자바 스크립트 배열
- button - 요소의 자식과 자식의 형제에 대해 Javascript 토글이 작동하지 않습니다
- JavaScript에서 배열 요소 정렬
- html - 자바 스크립트로 동적으로 생성 된 요소에 인라인 CSS를 추가하는 방법은 무엇입니까?
- javascript - 배열에 두 번째 배열과 공통된 요소가 포함되어 있는지 어떻게 확인할 수 있습니까?
- html - 요소를 하나씩 추가하고 JavaScript를 사용하여 브라우저에서 업데이트하는 방법은 무엇입니까?
- 내부의 모든 요소에 속성 추가 /순수 JavaScript [복제]
- 동일한 클래스를 가진 요소를 평범한 Javascript로 나란히 감싸십시오
- 자바 스크립트 배열에서 조건 자와 일치하는 요소 수를 얻는 방법은 무엇입니까?
- 특정 값으로 시작하지 않는 요소를 제거하는 자바 스크립트 루프
- html - eventListener에 대한 JavaScript의 배열 요소에 액세스
- Javascript를 사용하여 JSON 요소의 하위 항목을 가져 오시겠습니까?
- 필터 메서드를 사용하여 JavaScript 배열에서 특정 요소를 가져 오려면 어떻게해야합니까?
- Javascript의 2D 배열에서 각 하위 배열의 요소 추가
- arrays - 자바 스크립트를 사용하여 레벨 및 이름 정보를 사용하는 트리 계층 구조
- html - 자바 스크립트에서 ID가있는 두 요소를 어떻게 선택할 수 있습니까?
- php - javascript/jquery를 사용하여 비디오가 전체 화면 모드에서 해제 된 시점을 감지하는 방법
관련 질문
- javascript : 키로 사전 배열 내부 필터링
- javascript를 사용하여 동일한 키가 있는 경우 배열의 개체를 변경하는 방법
- JavaScript를 사용하여 버튼 클릭 시 배열 값을 지우시겠습니까?
- javascript : 배열에서 다중 값 객체 배열을 만드는 JS
- javascript : 사전 정의된 JS의 숫자, 문자열, 부울, 배열의 프로토타입 체인을 수동으로 끊거나 값을 재할당할 수 있습니까?
- javascript : Google Maps API.lat은 함수 오류가 아닙니다.
- javascript : 개체에서 두 개의 숫자 속성을 정렬한 다음 매핑
- javascript : 중첩 다중 루프
- javascript : URL에서 페이지로 이미지를 가져오는 방법
- javascript : 값을 사용하여 다른 배열과 일치시켜 배열에서 개체의 값을 올바르게 찾는 방법
자손을 방문하는 동안 방문한 노드를 감지하기 위해 흰색-회색-검정 색을 적용 할 수 있습니다 (그래프를 부모-자식 쌍 목록으로 단순화했습니다) :
이 접근법의 좋은 예 : https://algorithms.tutorialhorizon.com/graph-detect-cycle-in-a-directed-graph-using-colors/