简体   繁体   English

函数不返回值,仅返回console.logs

[英]Function doesn't return value, only console.logs

I'm new in JS but now I'm totally confused. 我是JS的新手,但现在我很困惑。 Why my function print logs into console but I can not return its value? 为什么我的函数print登录到控制台但无法返回其值?

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

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

        if (value === query) {
            console.log('property=' + key + ' name=' + obj["name"]);
            variableToReturn = obj["name"];
        }
    }
    return variableToReturn;
  }

but if I try that one in my code... it doesn't work at all 但是如果我在我的代码中尝试那个那个……根本不起作用

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

the variable is empty ;( I'm trying to understand it the whole day 变量为空;(我整天试图理解它

I get right values only in my console: 我只能在控制台中获得正确的值:

property=backward name=brumi

This is one of the object which I'm looking for: 这是我要寻找的对象之一:

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
  • Modified the code as it seemed it was not working for more than two objects Here is working code: 修改了代码,因为它似乎不适用于两个以上的对象这是有效的代码:

 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) 

Since you are using recursive functions inside your code, you need to add "return" in front of them 由于您在代码内部使用递归函数,因此需要在它们前面添加“ return”

In above code I have added return in for recursive searchObj(value, query); 在上面的代码中,我为递归searchObj(value, query);添加了return in searchObj(value, query); and obj["name"]; obj["name"]; .

let us know if this works 让我们知道这是否有效

From my understanding what you are trying to do is to recursively search a nested object and check that if there is a value in it that matches the parameter query . 据我了解,您想要做的是递归搜索嵌套对象,并检查其中是否有与参数query匹配的值。 The problem with your code is that the variable variableToReturn gets initialised to '' each time the function is called. 您的代码的问题在于,每次调用函数时,变量variableToReturn都会初始化为。 Since you are not returning variableToReturn when the value matches your query. 由于您未在值与查询匹配时返回variableToReturn The function will search through the nested objects until all the keys have been visited. 该功能将搜索嵌套对象,直到所有键都已被访问。 The last key may not contain the value that you desire, and since you declare variableToReturn to "" at the beginning of your code, it will return that value Try running your code in chrome and you will see that you'll the function will return "" . 最后一个键可能不包含您想要的值,并且由于您在代码的开头声明了variableToReturn到“”,它将返回该值。尝试在chrome中运行代码,您会看到函数将返回"" I believe that by adding a return to your recursive call and once you the current value matches the query will solve your issue. 我相信,通过在递归调用中添加return value ,一旦您当前valuequery匹配,就可以解决您的问题。 So your function should look something like below: 因此,您的函数应如下所示:

 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 ''; } 

A return statement passes a value back to the immediate caller of the current function's call-frame. return语句将值传递回当前函数的调用框架的直接调用者。 In the case of recursion, this immediate caller can be another invocation of that same function. 在递归的情况下,此直接调用方可以是同一功能的另一次调用。

Hence need to return the result of the recursion, or else the method implicitly returns "undefined" 因此,需要返回递归的结果,否则该方法将隐式返回“ undefined”

So, 所以,

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");

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM