저는 소프트웨어 필드를 처음 사용합니다. 나는 같은 객체의 json 배열을 가지고 있습니다.
var treeObj = [
{
"name": "sriram",
"refernce_id": "SAN001",
"sponer_id": "SAN000"
},
{
"name": "neeraja",
"refernce_id": "SAN002",
"sponer_id": "SAN001"
},
{
"name": "upender",
"refernce_id": "SAN003",
"sponer_id": "SAN001"
},
{
"name": "manoj",
"refernce_id": "SAN004",
"sponer_id": "SAN002"
},
{
"name": "shirisha",
"refernce_id": "SAN005",
"sponer_id": "SAN002"
},
{
"name": "ragu",
"refernce_id": "SAN006",
"sponer_id": "SAN003"
},
{
"name": "santhu",
"refernce_id": "SAN007",
"sponer_id": "SAN003"
}
];
여기서는 위의 객체를 함수에 전달합니다. 그 함수에서 나는 모든 객체에서 참조 ID를 sponer_id와 비교해야하고 그들이 같으면 아래와 같이 자식 객체로 호출하는 Array로 푸시해야하며 다시 참조 ID가 자식 배열에서 확인해야합니다 in이 다시 존재하는 경우 위 객체의 sponer_id에 존재합니다. reference_id를 포함하는 객체에 자식 배열로 푸시해야합니다. 최종 배열 객체는 다음과 같습니다.
[
{
"name": "sriram",
"parent": null,
"children": [
{
"name": "neeraja",
"parent": "sriram",
"children": [
{
"name": "manoj",
"parent": "neeraja"
},
{
"name": "shirisha",
"parent": "neeraja"
}
]
},
{
"name": "upender",
"parent": "sriram",
"children": [
{
"name": "ragu",
"parent": "neeraja"
},
{
"name": "santhu",
"parent": "neeraja"
}
]
}
]
}
]
여기서 treeObj의 sriram의 참조 ID는 neeraja 및 upender 개체에서 sponer ID로 존재합니다. 그래서 니라 자와 범인은 스리 람의 아이가됩니다. neeraja의 reference_id는 treeObj의 manoj 및 shirisha 객체에 sponer_id로 존재합니다. 동시에 자식은 더 많은 자식 개체를 사용할 수 있으며 개체의 형식을 동적으로 지정해야합니다.
내가 쓴 기능은 다음과 같습니다.
var mainArr = [], subArrs = [], subObj={}, subIds = [], find = "SAN001";
formatData(treeObj);
function formatData(treeObj){debugger;
var arr = [];
for(var x=0; x<= treeObj.length-1; x++){debugger;
var sampData = treeObj[x];
if(find == sampData.sponer_id){
arr.push(sampData.refernce_id);
subArrs.push(sampData);
}
}
subIds.push(arr);
console.log(subIds);
console.log(subArrs);
formatData(subArrs);
}
내가 어디로 잘못되었는지 안내 해주세요. 미리 감사드립니다.
//1. find all items the have no parent and push them on a stack like so:
let stack = treeObj.reduce((list, item) => {
if (<ids match>) list.push(item);
return item;
}, []),
let result = [].concat(stack);
//2. while loop the stack:
while (stack.length > 0) {
let item = stack.shift();
item.children = treeObj.reduce((list, child) => {
if (<ids match>) {
list.push(child);
}
return list;
}, []).map(child => {
child.parent = item;
stack.unshift(item);
return child;
});
}
return result;
최신 정보
그래서»좋은 오래된 JS«와 몇 가지 개선 사항 :
var stack = treeObj.filter(function (item) {
return item.<parent_id> === item.<child_id> });
var result = [].concat(stack);
while (stack.length > 0) {
var item = stack.shift();
item.children = treeObj.filter(function (child) {
return item.<id> === child.<parent_id>;
});
item.children.forEach(function (child) { stack.unshift(child) });
}
원래:
while.length > 0
shift()
스택의 첫 번째 항목unshift
스택에서끝난
항목에 부모 속성을 추가하거나 불필요한 항목을 제거하는 작업은 루프에서 수행 할 수 있습니다. 재귀를 사용하여 모든 작업을 수행 할 수도 있지만 한 번은 그런 작업을 수행하여»너무 많은 재귀 오류«를 겪었으므로 반복적 인 접근 방식을 선호합니다. 그리고, 대신 물론 .reduce
, .filter
그리고 .forEach
, 당신은 정기적으로 루프를 사용할 수 있지만, 나는 기능적인 스타일을 선호한다. 대체로, 어떻게 하든지간에 그렇게 어렵지 않습니다. 시작하는 요소를 찾은 다음 모든 자녀와 함께 반복합니다. while
루프를 사용하면 모든 자식이 발견되거나 해당 요소가 루트 인 전체 하위 트리를 찾습니다 .
행운을 빕니다!
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다