2016-04-22 32 views
1

我有一個數組,其中包含一個對象的平面列表,每個對象都有一個父屬性,一個id和其他一些東西。我可以用它來建立一個樹形結構。我想這樣做的是實際上只是收到是在一定的水平的項目:Javascript:跳過多維數組中的多個層次

1 
     1.1 
      1.1.1 
     1.2  
      1.2.1 
       1.2.1.1 

一樣,如果arr是我原來的數組,我可以做unflatten(arr)使它成爲一個樹狀結構,從那裏跳過級別1和2,將對象1.1.1,1.2.1和1.2.1.1留在(平坦)對象數組中。

這就是我現在所擁有的,建立一個樹狀結構,lodash:

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

不知道如果我甚至需要經過「unflatten」功能,爲了得到什麼我想,但那是我想我可能需要的,似乎更容易從那裏「削減」水平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