var menuData = [{ name: 'manage', title: '测试1', icon: 'home', }, { title: '测试2', name: 'car-parent', icon: 'android-car', children: [{ name: 'car', icon: 'android-car', title: '测试2-1' }] }, { title: '测试3', name: 'house-parent', icon: 'social-designernews', children: [{ icon: 'social-designernews', name: 'house-second', title: '测试3-1', children: [{ icon: 'social-designernews', name: 'house', title: '测试3-1-1' },{ icon:'test', name:'test', title:'测试3-1-2' }] }] }, { title: '测试2', name: 'car-parent', icon: 'android-car', children: [{ name: 'car', icon: 'android-car', title: '测试2-1' }] }]; function recursion (menuData, name) { // 最终要返回的数组 var arrTitle = [] // 遍历数组 for (var i = 0; i < menuData.length; i++) { // 每一次遍历最外层都需要清空 arrTitle = [] // 一个对象 var obj = menuData[i] // hack try { // 一个递归 (function (obj) { // 如果是数组则遍历 if ( Object.prototype.toString.call(obj) === '[object Array]' ) { // 遍历数组 for (var i = 0; i < obj.length; i++) { arguments.callee(obj[i]) } // 如果是对象则进行判断 } else if ( Object.prototype.toString.call(obj) === '[object Object]' ) { // 如果找到了,直接返回数组吧 if (obj.name == name) { // 我都服了我自己了 throw new Error('hack') // 如果存在 children 属性 } else if (obj.children) { // 二话不说先记录 arrTitle.push(obj.title); // 递归 arguments.callee(obj.children); } } })(obj); } catch (err) { return arrTitle } } return [] } console.log(recursion(menuData, 'house')); console.log(recursion(menuData, 'car')); console.log(recursion(menuData, 'abc'));