حذر
لم يعد هذا المستودع يتم الحفاظ عليه. النظر في القسم أدناه للبدائل.
يحول مجموعة من العناصر ذات المعرفات ومعرفات الوالدين إلى شجرة متداخلة بطريقة أداء (تعقيد الوقت O(n) ). يعمل في المتصفحات والعقدة.
الحزم الأخرى لها افتراضات أكثر صرامة أو ليست بمثابة أداء ، لأنها تستخدم حلقات أو عودية متداخلة. على سبيل المثال:
يتطلب O-unflatten أن يتم طلب المدخلات بحيث تأتي العقد الأم دائمًا أمام أطفالها. يستخدم Un-Flatten Tree حلقات متداخلة (تعقيد الوقت 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 : مفتاح حقل المعرف للعنصر. يعمل أيضًا مع خصائص متداخلة (على سبيل المثال "nested.parentId" ). الافتراضي: "id" .parentId : مفتاح حقل معرف الوالد للعنصر. يعمل أيضًا مع خصائص متداخلة (على سبيل المثال "nested.parentId" ). الافتراضي: "parentId" .nestedIds : خيار لتمكين/تعطيل المعرفات المتداخلة. الافتراضي: true .childrenField : المفتاح الذي سيحتوي على جميع العقد الفرعية للعقدة الأصل. الافتراضي: "children"dataField : المفتاح الذي سيحتوي على جميع الخصائص/بيانات العناصر الأصلية. قم بالتعيين على NULL إذا كنت لا تريد حاوية. الافتراضي: "data"throwIfOrphans : خيار لرمي خطأ إذا كانت مجموعة العناصر تحتوي على عنصر واحد أو أكثر ليس له آباء في المصفوفة أو إذا كانت مجموعة العناصر تحتوي على عناصر ذات علاقة والدتها/الطفل الدائرية. يحتوي هذا الخيار على عقوبة وقت تشغيل صغيرة ، لذلك يتم تعطيله افتراضيًا. عند التمكين ، ستقوم الوظيفة بإلقاء خطأ يحتوي على ParentIDs التي لم يتم العثور عليها في مجموعة العناصر ، أو في حالة علاقات العناصر الدائرية فقط خطأ عام. ستلقي الوظيفة خطأ إذا كان عدد العقد في الشجرة أصغر من عدد العقد في الصفيف الأصلي. عند تعطيلها ، ستتجاهل الوظيفة الأيتام والعلاقات الدائرية وعدم إضافتها إلى الشجرة. الافتراضي: falserootParentIds : كائن مع معرفات الأصل كمفاتيح true كقيم يجب اعتبارها العناصر العلوية أو الجذرية للشجرة. يكون هذا مفيدًا عندما تكون شجرتك مجموعة فرعية من الأشجار الكاملة ، مما يعني أنه لا يوجد عنصر هو معرف الوالدين هو واحد من undefined أو null أو '' . سيتم استبدال المصفوفة التي تمر بها القيمة الافتراضية. تعتبر دائمًا 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 : [ ] } ,
] ,
} ,
] ;مثال مع خصائص المعرف المتداخل/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