2016-02-22 3 views
-2

Мне нужна функция, чтобы проверить, существует ли объект в дереве.Если дерево содержит объект

Я рекурсивно запустить через дерево и использовать lodash для проверки равенства объектов:

var objectInResultList = function (obj, list) { 
 
    list.forEach(function (item) { 
 
    if (_.isEqual(item, obj) === true) { 
 
     return true 
 
    } 
 
    else if (item.children.length > 0) { 
 
     return objectInResultList(obj, item.children); 
 
    } 
 
    }); 
 
    return false; 
 
}; 
 
      
 
var item = {"name":"Enterprise1.1","description": "testTest","children":[]}; 
 
    
 
var resultList = [{"name":"Enterprise1.1","description": "testTest","children":[{"name":"Enterprise1.1","description": "testTest","children":[]}]}]; 
 
    
 
var ret = objectInResultList(item, resultList); 
 
alert(ret);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/1.2.1/lodash.min.js"></script>

Функция должна возвращать true, если элемент в списке и в противном случае вернуть false, но в настоящее время он всегда возвращает false.

Может ли кто-нибудь найти мою проблему?

JSFiddle

+1

В чем проблема с этим кодом? Какой результат вы получите вместо ожидаемого? – Teemu

+0

моя функция должна возвращать true, если элемент находится в результирующем списке ... и возвращает false, если нет в списке результатов –

+0

И что вы получаете с вашим текущим кодом? – Teemu

ответ

1

Вы пропускаете несколько вещей.

  1. Небольшая вещь - ваш предикат не возвращается false, если объекты не совпадают, и у него нет детей.
  2. Вы возвращаете true/false из предиката, но не используете его нигде, поэтому objectInResultList всегда возвращает false.

Вместо того чтобы использовать forEach, то проще использовать find или findIndex, и использовать результат, что для определения того, что возвращаться из objectInResultList. Например, если find возвращает undefined из-за отсутствия соответствия, то вы возвращаете false.

В этом случае вы используете дерево с несколькими списками, поэтому использование find имеет больше смысла, чем findIndex.

var objectInResultList = function (obj, list) { 
 
    // call find to get the matching object 
 
    var match = list.find(function (item) { 
 
    if (_.isEqual(item, obj) === true) { 
 
     return true; 
 
    } 
 
    else if (item.children.length > 0) { 
 
     return objectInResultList(obj, item.children); 
 
    } 
 
    else { 
 
     return false; 
 
    } 
 
    }); 
 
    
 
    // if match is undefined return false. If we found a match, return true 
 
    return !_.isUndefined(match); 
 
}; 
 

 
var item = {"name":"Enterprise1.1","description": "testTest","children":[]}; 
 

 
var resultList = [{"name":"Enterprise1.1","description": "testTest","children":[{"name":"Enterprise1.1","description": "testTest","children":[]}]}]; 
 

 
var ret = objectInResultList(item, resultList); 
 
alert(ret);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/1.2.1/lodash.min.js"></script>

+0

Большое спасибо! –

0

Foreach() не имеет возвращаемого значения и игнорирует любое возвращаемое значение. Поэтому возвращение true или false в функцию поиска бесполезно.

Вы должны использовать лучшую итератор-функцию.

var objectInResultList = function (obj, list) { 
    function search(item){ 
     if(item == null) return false; 
     if(_.isArray(item)) return _.some(item, search); 
     if(_.isEqual(item, obj)) return true; 
     return search(item.children); 
    } 
    return search(list); 
}; 
+0

Большое спасибо! –

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