คำเตือน
ที่เก็บนี้ไม่ได้รับการดูแลอีกต่อไป พิจารณาส่วนด้านล่างสำหรับทางเลือก
แปลงอาร์เรย์ของรายการที่มี ID และรหัสผู้ปกครองเป็นต้นไม้ซ้อนกันในรูปแบบการปฏิบัติ (ความซับซ้อนของเวลา O(n) ) ทำงานในเบราว์เซอร์และโหนด
แพ็คเกจอื่น ๆ มีสมมติฐานที่เข้มงวดกว่าหรือไม่ได้เป็นนักแสดงเนื่องจากพวกเขามักจะใช้ลูปซ้อนกันหรือการเรียกซ้ำ ตัวอย่างเช่น:
O-unflatten ต้องการอินพุตที่จะสั่งซื้อเพื่อให้โหนดหลักมักจะมาต่อหน้าลูก ๆ ของพวกเขา un-flatten-tree ใช้ 2 ลูปซ้อนกัน (ความซับซ้อนของเวลา O(n^2) )
การใช้งานนี้ไม่จำเป็นต้องมีลำดับรายการใด ๆ ในอาร์เรย์อินพุตและมุ่งเน้นไปที่ประสิทธิภาพการทำงานของรันไทม์ มันเร็วที่สุดในบรรดาแพ็คเกจที่แตกต่างกัน 4 แบบคุณสามารถค้นหาเกณฑ์มาตรฐานได้ที่นี่ มันใช้ดัชนีและลูปเดียว (ความซับซ้อนของเวลา O(n) ) มันได้รับแรงบันดาลใจจากการสนทนานี้เกี่ยวกับ Stackoverflow
yarn add performant-array-to-tree
หรือถ้าใช้ NPM
npm install --save performant-array-to-tree
const tree = arrayToTree ( [
{ id : "4" , parentId : null , custom : "abc" } ,
{ id : "31" , parentId : "4" , custom : "12" } ,
{ id : "1941" , parentId : "418" , custom : "de" } ,
{ id : "1" , parentId : "418" , custom : "ZZZz" } ,
{ id : "418" , parentId : null , custom : "ü" } ,
] ) ;ซึ่งส่งผลในอาร์เรย์ต่อไปนี้:
[
{
data : { id : "4" , parentId : null , custom : "abc" } ,
children : [
{ data : { id : "31" , parentId : "4" , custom : "12" } , children : [ ] } ,
] ,
} ,
{
data : { id : "418" , parentId : null , custom : "ü" } ,
children : [
{ data : { id : "1941" , parentId : "418" , custom : "de" } , children : [ ] } ,
{ data : { id : "1" , parentId : "418" , custom : "ZZZz" } , children : [ ] } ,
] ,
} ,
] ; คุณสามารถให้อาร์กิวเมนต์ที่สองเพื่อ ArrayTotree พร้อมตัวเลือกการกำหนดค่า ตอนนี้คุณสามารถตั้งค่าต่อไปนี้:
id : คีย์ของฟิลด์ ID ของรายการ ยังทำงานร่วมกับคุณสมบัติที่ซ้อนกัน (เช่น "nested.parentId" ) ค่าเริ่มต้น: "id"parentId : คีย์ของฟิลด์ ID ของผู้ปกครองของรายการ ยังทำงานร่วมกับคุณสมบัติที่ซ้อนกัน (เช่น "nested.parentId" ) ค่าเริ่มต้น: "parentId"nestedIds : ตัวเลือกในการเปิด/ปิดใช้งานรหัสซ้อนกัน ค่าเริ่มต้น: truechildrenField : คีย์ซึ่งจะมีโหนดลูกทั้งหมดของโหนดแม่ ค่าเริ่มต้น: "children"dataField : คีย์ซึ่งจะมีคุณสมบัติ/ข้อมูลทั้งหมดของรายการต้นฉบับ ตั้งค่าเป็น NULL หากคุณไม่ต้องการคอนเทนเนอร์ ค่าเริ่มต้น: "data"throwIfOrphans : ตัวเลือกในการโยนข้อผิดพลาดหากอาร์เรย์ของรายการมีรายการหนึ่งรายการหรือมากกว่าที่ไม่มีผู้ปกครองในอาร์เรย์หรือหากอาร์เรย์ของรายการมีรายการที่มีความสัมพันธ์ระหว่างผู้ปกครอง/เด็กแบบวงกลม ตัวเลือกนี้มีการลงโทษรันไทม์ขนาดเล็กดังนั้นจึงปิดการใช้งานโดยค่าเริ่มต้น เมื่อเปิดใช้งานฟังก์ชั่นจะส่งข้อผิดพลาดที่มี parentids ที่ไม่พบในอาร์เรย์รายการหรือในกรณีที่มีความสัมพันธ์เฉพาะรายการเป็นวงกลมเป็นข้อผิดพลาดทั่วไป ฟังก์ชั่นจะส่งข้อผิดพลาดหากจำนวนโหนดในต้นไม้มีขนาดเล็กกว่าจำนวนโหนดในอาร์เรย์ดั้งเดิม เมื่อปิดใช้งานฟังก์ชั่นจะเพิกเฉยต่อเด็กกำพร้าและความสัมพันธ์แบบวงกลมและไม่เพิ่มลงในต้นไม้ ค่าเริ่มต้น: falserootParentIds : วัตถุที่มี ID หลักเป็นคีย์และ true เป็นค่าที่ควรได้รับการพิจารณาว่าเป็นองค์ประกอบด้านบนหรือรากของต้นไม้ สิ่งนี้มีประโยชน์เมื่อต้นไม้ของคุณเป็นชุดย่อยของต้นไม้เต็มซึ่งหมายความว่าไม่มีรายการที่มี ID หลักเป็นหนึ่งใน null undefined หรือ '' อาร์เรย์ที่คุณส่งผ่านจะถูกแทนที่ค่าเริ่มต้น undefined และ null มักจะถือว่าเป็น rootparentids สำหรับรายละเอียดเพิ่มเติมดูที่ #23 ค่าเริ่มต้น: {'': true}assign : ตัวเลือกที่เปิดใช้งาน Object.assign แทนตัวดำเนินการสเปรดเพื่อสร้างรายการในต้นไม้เมื่อ dataField เป็น null สิ่งนี้มีประโยชน์หากรายการของคุณมีต้นแบบที่ควรได้รับการบำรุงรักษา หากเปิดใช้งานและ dataField เป็น null รายการโหนดดั้งเดิมจะถูกใช้และคุณสมบัติของ children จะถูกกำหนดโดยเรียกตัวตั้งค่าใด ๆ ในฟิลด์นั้น หาก dataField ไม่เป็น null ตัวเลือกนี้จะไม่มีผลเนื่องจากโหนดดั้งเดิมจะถูกใช้ภายใต้ dataField ของวัตถุใหม่ หากคุณไม่แน่ใจว่าคุณต้องการเปิดใช้งานสิ่งนี้หรือไม่ก็น่าจะดีที่จะปิดใช้งาน ค่าเริ่มต้น: falseตัวอย่าง:
const tree = arrayToTree (
[
{ num : "4" , ref : null , custom : "abc" } ,
{ num : "31" , ref : "4" , custom : "12" } ,
{ num : "1941" , ref : "418" , custom : "de" } ,
{ num : "1" , ref : "418" , custom : "ZZZz" } ,
{ num : "418" , ref : null , custom : "ü" } ,
] ,
{ id : "num" , parentId : "ref" , childrenField : "nodes" }
) ;ซึ่งผลิต:
[
{
data : { num : "4" , ref : null , custom : "abc" } ,
nodes : [ { data : { num : "31" , ref : "4" , custom : "12" } , nodes : [ ] } ] ,
} ,
{
data : { num : "418" , ref : null , custom : "ü" } ,
nodes : [
{ data : { num : "1941" , ref : "418" , custom : "de" } , nodes : [ ] } ,
{ data : { num : "1" , ref : "418" , custom : "ZZZz" } , nodes : [ ] } ,
] ,
} ,
] ;ตัวอย่างที่ไม่มีฟิลด์ข้อมูล:
const tree = arrayToTree (
[
{ id : "4" , parentId : null , custom : "abc" } ,
{ id : "31" , parentId : "4" , custom : "12" } ,
{ id : "1941" , parentId : "418" , custom : "de" } ,
{ id : "1" , parentId : "418" , custom : "ZZZz" } ,
{ id : "418" , parentId : null , custom : "ü" } ,
] ,
{ dataField : null }
) ;ซึ่งผลิต:
[
{
id : "4" ,
parentId : null ,
custom : "abc" ,
children : [ { id : "31" , parentId : "4" , custom : "12" , children : [ ] } ] ,
} ,
{
id : "418" ,
parentId : null ,
custom : "ü" ,
children : [
{ id : "1941" , parentId : "418" , custom : "de" , children : [ ] } ,
{ id : "1" , parentId : "418" , custom : "ZZZz" , children : [ ] } ,
] ,
} ,
] ;ตัวอย่างที่มีคุณสมบัติ ID/ParentID ที่ซ้อนกัน:
const tree = arrayToTree (
[
{ num : { id : "4" } , parent : { parentId : null } , custom : "abc" } ,
{ num : { id : "31" } , parent : { parentId : "4" } , custom : "12" } ,
] ,
{ id : "num.id" , parentId : "parent.parentId" }
) ;ซึ่งผลิต:
[
{
data : { num : { id : "4" } , parent : { parentId : null } , custom : "abc" } ,
children : [
{
data : { num : { id : "31" } , parent : { parentId : "4" } , custom : "12" } ,
children : [ ] ,
} ,
] ,
} ,
] ; โครงการนี้มีประเภทเพียงแค่นำเข้าโมดูลตามปกติ:
import { arrayToTree } from "performant-array-to-tree" ;
const tree = arrayToTree ( array ) ; yarn version เพื่อสร้างเวอร์ชันใหม่ npm login npm publish --access public เพื่อเผยแพร่ไปยัง NPM