2017-04-12 71 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");