2014-02-14 183 views
1

我是JS的新手,我不得不將它用於Cloud Code Parse功能。我有一個名爲「user_picture」的類,通過代碼我查詢所有的對象,並通過它的「城市」屬性。我希望響應是一個獨特的城市名稱數組。總之,這裏是我工作的代碼:JS代碼返回錯誤

Parse.Cloud.define("cities", function(request, response) { 
var query = new Parse.Query("user_picture"); 
query.find({ 
success: function(results) { 
    var cities = new Array(); 

    for (var object in results){ 
     var tempArray = [object.get("city")]; 

     if (cities.length > 0){ 
      for (var i = 0; i < cities.length; i++){ 
       if (cities[i].get("city") == object.get("city")) { 
        break; 
       } else if (i == cities.length-1) { 
        cities = cities.concat(tempArray); 
       } 
      } 
     } 
    } 
    response.success (cities); 
}, error: function() { 
    response.error("Error"); 
} 
});}); 

然而,當我運行這個功能我收到以下錯誤:

Error: TypeError: Object 0 has no method 'get' 
at query.find.success (main.js:15:30) 
at Parse.js:2:5786 
at r (Parse.js:2:4981) 
at Parse.js:2:4531 
at Array.forEach (native) 
at Object.E.each.E.forEach [as _arrayEach] (Parse.js:1:666) 
at n.extend.resolve (Parse.js:2:4482) 
at r (Parse.js:2:5117) 
at Parse.js:2:4531 
at Array.forEach (native) (Code: 141, Version: 1.2.18) 

和響應返回null。我嘗試從結果數組中打印一個對象,以確保我收到正確的查詢,並且它打印的城市很好。可能是什麼問題呢?

+1

結果是什麼樣的對象?它告訴你它沒有方法'get'。也許你的意思是'object.city'? – Mathletics

+0

哪一行導致錯誤? – ppoliani

+0

@ppoliani我無法識別代碼在Parse.com服務器上運行的錯誤。 – HusseinB

回答

1

for in循環遍歷對象文字的所有鍵。由於results是一個數組,它將循環遍歷數組的鍵'0','1'等。

這意味着object變量將保存這些關鍵值。而且由於它們不是對象,所以它們沒有稱爲get的方法。請使用forEach循環。

results.forEach(function(object){ 
    var tempArray = [object.get("city")]; 

    if (cities.length > 0){ 
     for (var i = 0; i < cities.length; i++){ 
      if (cities[i].get("city") == object.get("city")) { 
       break; 
      } else if (i == cities.length-1) { 
       cities = cities.concat(tempArray); 
      } 
     } 
    } 
} 

});

或者,如果你的目標ES3那麼你應該使用一個for循環

for(var i = 0, length = results.length; i< length; i++){ 
    var object = results[i]; 

    var tempArray = [object.get("city")]; 

    if (cities.length > 0){ 
     for (var i = 0; i < cities.length; i++){ 
      if (cities[i].get("city") == object.get("city")) { 
       break; 
      } else if (i == cities.length-1) { 
       cities = cities.concat(tempArray); 
      } 
     } 
    } 
} 
0

我記得與解析工作的對象了一下,好像有次訪問它們作爲對象(通過直接的參數訪問),有時使用get方法,它看起來像混合了數組訪問和對象(來自Parse)訪問方法。

此外,您的列表生成器似乎並不像它真的構建一個唯一的列表。您只檢查當前城市是否與您要添加的城市相同。

我可以做更多的東西像這樣(的成功方法):

function(parseResults) { 
    var cities = {}; 
    var ii=0; 
    var nResults = parseResults.length 
    for(;ii<nResults;++ii) { 
    cities[result.get('city')] = 1 
    } 
    var citiesArray = cities.keys(); 
    response.success(citiesArray); 
} 

我們在這裏做的是建立一個對象,它的鍵是城市名稱。然後將這些鍵作爲數組返回。這對我們來說是自動構建一個唯一的列表,因爲對象鍵應該是唯一的。

如果result.get給您帶來問題,請嘗試將其替換爲result.city。但是我懷疑你在第一個例子中看到的錯誤是試圖在Array元素上調用get

+0

爲什麼你提供一個使用特定庫的例子?在您的項目中不需要包含underscore.js來遍歷數組。 – ppoliani

+0

拿了點。我已經更新了代碼片段來使用vanilla JS。此代碼只假設一個包含'keys()'方法的現代javascript(ECMAScript 5)。 –