2016-04-22 2 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, спасибо большое! И whoa, этого более чем достаточно с n> 100;), мне нужно это для массива из 10-20 элементов. Любая идея, если это можно уменьшить с помощью lodash? – chrney

+0

Впечатляет, действительно. Очень хорошо сделано - спасибо, работает так, как хотелось бы. – chrney

+1

Для таких случаев есть специальное действие. Вы можете принять ответ;) – sbeliakov

Смежные вопросы