2015-09-10 2 views
2

Я хочу найти все зависимые от определенного элемента от объекта.Поиск зависимости от нескольких массивов

{ 
    "x": ["a", "b"], 
    "a": ["1", "2"], 
    "b": [], 
    "1": ["abc"], 
    "2": [], 
    "abc": [] 
} 

Желаемый результат: все зависимости пунктов

{ 
    "x" : ["a", "b", "1", "2", "abc"], 
    "a" : ["1", "2", "abc"], 
    "1" : ["abc"] 
} 
+0

являются переменными 'a',' b' и 'abc'? – PitaJ

+0

nope .. они просто имена файлов –

+0

Похоже, вам нужно будет пройти через ваш объект и рекурсивно прочитать значения для каждого ключа – nils

ответ

4

Вы в основном нужны две функций:

  1. One к проходному вашему объекту и найти свойство: loopObject
  2. One для решения ваших зависимостей: getDependencies

Для каждого свойства в loopObject, getDependencies вызывается для каждого элемента в массиве свойства рекурсивно.

В конце loopObject возвращает новый объект со всеми зависимостями.

var searchDependencies = { 
 
    "x": ["a", "b"], 
 
    "a": ["1", "2"], 
 
    "b": [], 
 
    "1": ["abc"], 
 
    "2": [], 
 
    "abc": [] 
 
}; 
 

 
function loopObject(obj) { 
 
    var resObj = {}; 
 
    Object.keys(obj).forEach(function(item) { 
 
    resObj[item] = getDependencies(obj[item], obj); 
 
    if(resObj[item].length < 1) { 
 
     delete resObj[item]; 
 
    } 
 
    }); 
 

 
    return resObj; 
 
} 
 

 
function getDependencies(arr, obj){ 
 
    var resArr = arr; 
 
    arr.forEach(function(item) { 
 
    resArr = resArr.concat(getDependencies(obj[item], obj)); 
 
    }); 
 
    return resArr; 
 
} 
 

 
var resolvedDependencies = loopObject(searchDependencies); 
 

 
console.log(resolvedDependencies);

Отъезд JSFiddle для рабочего примера.

Слово предостережения

Смотрите, что у вас нет циклических dependecies, например .:

{ 
    "a": ["b"], 
    "b": ["a"] 
} 

В противном случае вы застряли в бесконечном цикле.

+0

Решение неточно - «b», «2» и «abc» не должны быть в выходе. – Amit

+0

Исправлено это, спасибо. – nils

3

Не проверял, но это должно быть близко к тому, что вам нужно сделать:

function getDeps(name){ 
    var deps = arr[name]; 
    deps.forEach(function(name){ 
    deps = deps.concat(getDeps(name)); 
    }); 
    return deps; 
} 

Вам нужно искать рекурсивно через массив для каждого имени файла.

+0

спасибо .. дайте мне проверить –

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