2016-07-15 3 views
0

У меня есть дерево структурированный объект напримерПоиск объекта с определенным значением

var x = [{ 
    id: 1, 
    children: [{ 
    id: 11, 
    children: [], 
    }, { 
    id: 12, 
    children: [{ 
     id: 121, 
     name:'jogn', 
     children: [] 
    }] 
    }] 
}, { 
    id: 2, 
    children: [], 
}] 

И я хотел бы найти объект с конкретным ID в нем. I производства

function printObj(obj , val) { 
    for(var i = 0; i < obj.length ; i++){ 
     if(obj[i].id == val){ 
     return obj[i]; 
     } 
     if(obj[i].children.length > 0){ 
      printObj(obj[i].children) 
     } 
    } 
} 

функция. Проблема заключается в том, когда я призываю его

var g = printObj(x , 121); 
alert(x.name) 

возвращает неопределенное вместо jogn altought, когда я совать некоторое предупреждение, если он findes установить значение это найти. Почему он возвращает неправильный объект?

+2

что, если вы оповещения 'г. name' вместо 'x'? – csmckelvey

+0

Кроме того, вы не возвращаете ничего из printObj (детей), чтобы рекурсивный результат просто исчез. – Shilly

ответ

3

две проблемы с этой линии:

printObj(obj[i].children); 
  1. Это отсутствует второй аргумент

  2. Вы должны возвращения своего результата, если он находит один

So

var possibleResult = printObj(obj[i].children, val); 
// -------------------------------------------^^^^^ 
if (possibleResult) { 
    return possibleResult; 
} 

Отдельно в ходе тестирования вы искали x.name, где захотели g.name.

Исправлено:

var x = [{ 
 
    id: 1, 
 
    children: [{ 
 
    id: 11, 
 
    children: [], 
 
    }, { 
 
    id: 12, 
 
    children: [{ 
 
     id: 121, 
 
     name: 'jogn', 
 
     children: [] 
 
    }] 
 
    }] 
 
}, { 
 
    id: 2, 
 
    children: [], 
 
}]; 
 

 
function printObj(obj, val) { 
 
    for (var i = 0; i < obj.length; i++) { 
 
    if (obj[i].id == val) { 
 
     return obj[i]; 
 
    } 
 
    if (obj[i].children.length > 0) { 
 
     var possibleResult = printObj(obj[i].children, val); 
 
     if (possibleResult) { 
 
     return possibleResult; 
 
     } 
 

 
    } 
 
    } 
 
} 
 

 
var g = printObj(x, 121); 
 
console.log(g.name);

0

Ramda отлично подходит для объектов и список работ от функционального подхода - здесь проходится ваши данные -

 

    var x = [{ 
     id: 1, 
     children: [{ 
     id: 11, 
     children: [], 
     }, { 
     id: 12, 
     children: [{ 
      id: 121, 
      name: 'jogn', 
      children: [] 
     }] 
     }] 
    }, { 
     id: 2, 
     children: [], 
    }] 


    const findById = (id, list) => map(o => { 
     if(o.id === id) return o 
     return findById(id, o.children) 
    }, list) 

    head(flatten(findById(121, x))) 

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