Peringatan
Repositori ini tidak lagi dipertahankan. Pertimbangkan bagian di bawah ini untuk alternatif.
Mengubah serangkaian item dengan ID dan ID induk menjadi pohon bersarang dengan cara performant (kompleksitas waktu O(n) ). Berjalan di browser dan node.
Paket lain memiliki asumsi yang lebih ketat atau tidak sebagai kinerja, karena mereka sering menggunakan loop atau rekursi bersarang. Misalnya:
O-Unflatten mengharuskan input untuk dipesan sedemikian rupa sehingga node orang tua selalu datang di hadapan anak-anak mereka. un-flatten-tree menggunakan 2 loop bersarang (kompleksitas waktu O(n^2) ).
Implementasi ini tidak memerlukan urutan item apa pun dalam array input dan berfokus pada kinerja runtime. Ini adalah yang tercepat di antara 4 paket berbeda, Anda dapat menemukan tolok ukur di sini. Ini menggunakan indeks dan satu loop (kompleksitas waktu O(n) ). Itu terinspirasi oleh diskusi ini di StackoverFlow.
yarn add performant-array-to-tree
atau jika menggunakan 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 : "ü" } ,
] ) ;Yang menghasilkan array berikut:
[
{
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 : [ ] } ,
] ,
} ,
] ; Anda dapat memberikan argumen kedua kepada ArrayTotree dengan opsi konfigurasi. Saat ini, Anda dapat mengatur yang berikut:
id : Kunci bidang ID item. Juga bekerja dengan properti bersarang (misalnya "nested.parentId" ). Default: "id" .parentId : Kunci bidang ID induk dari item tersebut. Juga bekerja dengan properti bersarang (misalnya "nested.parentId" ). Default: "parentId" .nestedIds : Opsi untuk mengaktifkan/menonaktifkan ID bersarang. Default: true .childrenField : Kunci yang akan berisi semua node anak dari node induk. Default: "children"dataField : Kunci yang akan berisi semua properti/data dari item asli. Diatur ke NULL jika Anda tidak menginginkan wadah. Default: "data"throwIfOrphans : Opsi untuk melempar kesalahan jika array item berisi satu atau lebih item yang tidak memiliki orang tua dalam array atau jika array item berisi item dengan hubungan induk/anak melingkar. Opsi ini memiliki penalti runtime kecil, jadi dinonaktifkan secara default. Saat diaktifkan, fungsi akan melempar kesalahan yang mengandung orangtua yang tidak ditemukan dalam array item, atau dalam hal hanya hubungan item melingkar kesalahan generik. Fungsi akan melempar kesalahan jika jumlah node di pohon lebih kecil dari jumlah node dalam array asli. Saat dinonaktifkan, fungsi hanya akan mengabaikan anak yatim dan hubungan melingkar dan tidak menambahkannya ke pohon. Default: falserootParentIds : Objek dengan ID induk sebagai kunci dan true sebagai nilai yang harus dianggap sebagai elemen teratas atau root dari pohon. Ini berguna ketika pohon Anda adalah bagian dari pohon penuh, yang berarti tidak ada item yang ID induknya adalah salah satu dari undefined , null atau '' . Array yang Anda lewati akan mengganti nilai default. undefined dan null selalu dianggap sebagai rootparentids. Untuk detail lebih lanjut, lihat #23. Default: {'': true}assign : Opsi yang memungkinkan Object.assign alih -alih operator spread untuk membuat item di pohon saat dataField adalah null . Ini berguna jika item Anda memiliki prototipe yang harus dipertahankan. Jika diaktifkan dan dataField adalah null , item simpul asli akan digunakan, dan properti children akan ditugaskan, memanggil setiap setter di bidang itu. Jika dataField tidak null , opsi ini tidak berpengaruh, karena node asli akan digunakan di bawah dataField objek baru. Jika Anda tidak yakin apakah Anda perlu mengaktifkan ini, kemungkinan besar akan membiarkannya dinonaktifkan. Default: falseContoh:
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" }
) ;Yang menghasilkan:
[
{
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 : [ ] } ,
] ,
} ,
] ;Contoh tanpa bidang data:
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 }
) ;Yang menghasilkan:
[
{
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 : [ ] } ,
] ,
} ,
] ;Contoh dengan Properti ID/Parentid Nested:
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" }
) ;Yang menghasilkan:
[
{
data : { num : { id : "4" } , parent : { parentId : null } , custom : "abc" } ,
children : [
{
data : { num : { id : "31" } , parent : { parentId : "4" } , custom : "12" } ,
children : [ ] ,
} ,
] ,
} ,
] ; Proyek ini mencakup jenis, cukup impor modul seperti biasa:
import { arrayToTree } from "performant-array-to-tree" ;
const tree = arrayToTree ( array ) ; yarn version untuk membuat versi baru npm login npm publish --access public untuk menerbitkannya ke NPM