2016-04-22 4 views
1

私はオブジェクトのフラットなリストを保持する配列を持ち、そのうちの1つとそれぞれを親プロパティ、ID、その他のいくつかのもので保持しています。私はそれを使って木構造を構築することができます。 arrは私の元の配列であれば、私はそれツリー状の構造にするためにunflatten(arr)を行うことができ、Javascript:多次元配列の複数のレベルをスキップする

1 
     1.1 
      1.1.1 
     1.2  
      1.2.1 
       1.2.1.1 

のように、と:私は何をしたいのは、実際には一定のレベルにあるアイテムを受信しますそこからレベル1と2をスキップし、オブジェクト1.1.1,1.2.1、および1.2.1.1をオブジェクトの(フラットな)配列のままにします。

これは私がlodashでツリー構造を構築し、今持っているものです。

http://plnkr.co/edit/eRvVegJsZ9JPYeJCVwOc?p=preview

ない私も何を得るために、「非平坦化」機能を通過する必要がある場合は必ず私は欲しいが、それは私が必要と考えるかもしれないと思うもので、そこからレベル1 & 2を "カット"する方が簡単だと思われる。私の目標は、配列とスキップするレベルの数を提供する関数を使用することです。

+0

こんにちは!前/後の例があることは明らかです。 –

+0

私はplnkr.coのリンクにありますが、私はこのようなものを作りたいと思います: – chrney

答えて

1

レベル>=kのすべての要素をリストに入れたいだけですか?

その後、次のコードは、おそらくあなた

function findId(arr, id) { 
    return _.findIndex(arr, function(el) { 
    return el.id == id; 
    }); 
} 

function depth(arr, idx) { 
    if (arr[idx] && arr[idx].parent) { 
    var parentId = arr[idx].parent; 
    var parentIdx = findId(arr, parentId); 
    return depth(arr, parentIdx) + 1; 
    } else { 
    return 1; 
    } 
} 

function unflattenFromLevel(arr, minLevel) { 
    return _.filter(arr, function(el) { 
    var idx = findId(arr, el.id); 
    return depth(arr, idx) >= minLevel; 
    }); 
} 

HereはjsFiddleでいくつかのテストとコードであるのに役立ちます。

それとも、読みやすさを気にしないだけでスリム

function depth(arr, idx) { 
    if (arr[idx] && arr[idx].parent) { 
    return depth(arr, _.findIndex(arr, el => el.id == arr[idx].parent)) + 1; 
    } else { 
    return 1; 
    } 
} 

function unflattenFromLevel(arr, minLevel) { 
    return _.filter(arr, el => depth(arr, _.findIndex(arr, el2 => el2.id == el.id)) >= minLevel); 
} 

Here it is

について、私はときにそれを使用してはならないことを意味する、このコードはO(n^3)の漸近を持っていることを警告する必要があるがあればnは100より大きくなります。これは線形解に最適化できます。

+0

Pitchperfekt、ありがとう!そして、それは十分にn> 100;以上)、私は10-20項目の配列のためにこれが必要です。これはlodashを使ってややスリムにすることができますか? – chrney

+0

確かに印象的です。非常にうまくいった - ありがとう、私はそれが望むように動作します。 – chrney

+1

このような場合には特別な処置があります。あなたは答えを受け入れるかもしれません;) – sbeliakov