2017-04-12 77 views
0

我是新的JS,但现在我完全困惑。为什么我的函数打印日志到控制台,但我不能返回它的值?函数不返回值,只有console.logs

​​

但如果我尝试一个在我的代码...它没有在所有

var newAttributes =searchObj(position, "1277,1795"); 

变量为空工作;(我试图去了解它

了整整一天

我只在我的控制台得到正确的价值观:

property=backward name=brumi 

这就是我正在寻找的对象之一:

var position = { 
    current: { 
    coordinates: '2408,1822', 
    name: 'start', 
    premiumPoints: 0, 
    points: 0, 
    right: Projects.detectProjectByKeyword("moneymat").coordinates, 
    left: Projects.detectProjectByKeyword("wohnung").coordinates, 
    forward: Projects.detectProjectByKeyword("supermarkt").coordinates, 
    backward: "0,0" 
    }, 
    start: //more objects to check 
+1

在你newAttributes变量,是什么位置,一个变量或某种值? – Lixus

+3

你缺少'返回searchObj(值,查询)返回;'(或'variableToReturn = searchObj(值,查询);') – James

+1

詹姆斯,我不明白是什么意思? Lixus的立场是一个对象。 –

回答

1
  • 修改了代码,因为它似乎它不工作了两个多对象 这里是工作代码:

var position = { 
 
    current: { 
 
    coordinates: '2408,1822', 
 
    name: 'start', 
 
    premiumPoints: 0, 
 
    points: 0, 
 
    backward: "0,0" 
 
    }, 
 
    some: { 
 
    coordinates: '2409,1822', 
 
    name: 'Some Start', 
 
    premiumPoints: 0, 
 
    points: 0, 
 
    backward: "0,0" 
 
    }, 
 
    more: { 
 
    coordinates: '2400,1822', 
 
    name: 'more Start', 
 
    premiumPoints: 0, 
 
    points: 0, 
 
    backward: "0,0" 
 
    } 
 
}; 
 

 
function searchObj(obj, query) { 
 
    var data =''; 
 
    for (var property in obj) { 
 
    if (obj.hasOwnProperty(property)) { 
 
     if (typeof obj[property] === "object") { 
 
     data = searchObj(obj[property], query);  
 
     if(data !='') return data; 
 
     } 
 
     else { 
 
     if (obj[property] === query) {   
 
      return obj["name"];    
 
     } 
 
     } 
 
    } 
 
    } 
 
    
 
    return data; 
 
} 
 

 
var data = searchObj(position, "2400,1822") 
 
console.log("Result : " +data)

由于您使用的代码中递归函数,你需要添加在他们

前在我在加return递归searchObj(value, query);obj["name"];上面的代码“返回”。

让我们知道这是否正常工作

+0

它仍然无法正常工作;( –

0

从我的理解你要做的是递归搜索一个嵌套的对象,并检查它是否有一个值与参数query匹配。代码的问题在于,每次调用函数时,变量variableToReturn都被初始化为“'。由于当值与您的查询匹配时,您没有返回variableToReturn。该函数将搜索嵌套的对象,直到所有的键都被访问过。最后一个键可能不包含你想要的值,并且因为你在代码的开头声明了variableToReturn“”,它会返回该值。尝试在chrome中运行你的代码,你会看到你将函数返回""。我相信通过在您的递归调用中添加return,并且当您的当前valuequery匹配时,将解决您的问题。所以,你的函数看起来应该象下面这样:

function searchObj (obj, query) { 
 
    // loop through the keys in obj 
 
    for (let key in obj) { 
 
     let value = obj[key]; 
 

 
     if (typeof value === 'object') { 
 
      // current value is an object, so search recursively 
 
      return searchObj(value, query); 
 
     } 
 

 
     if (value === query) { 
 
      // found the value 
 
      return obj['name']; 
 
     } 
 
    } 
 
    // can't find keys that match, so return empty string 
 
    return ''; 
 
}

+0

准确说明你改变了什么,以及为什么有必要*“试试下面的代码” *不是问题和解决方案的说明 – 2017-04-12 16:26:24

0

return语句传递的值返回到当前函数的调用帧的直接调用方。在递归的情况下,这个直接调用者可以是该同一函数的另一个调用。

因此需要返回递归的结果,否则该方法隐含返回“未定义”

所以,

var position = { 
    current: { 
    coordinates: '2408,1822', 
    name: 'start', 
    premiumPoints: 0, 
    points: 0, 
    backward: "0,0" 
    } 
    }; 

    function searchObj (obj, query) { 
    var variableToReturn=""; 
    for (var key in obj) { 
     var value = obj[key]; 

     if (typeof value === 'object') { 
      return searchObj(value, query); 
     } 

     if (value === query) { 

      variableToReturn = obj["name"]; 
     } 
    } 
    return variableToReturn; 
    } 

    var variableToReturn = searchObj(position, "2408,1822");