我是JS的新手,我不得不将它用于Cloud Code Parse功能。我有一个名为“user_picture”的类,通过代码我查询所有对象并通过它的“City”属性。我希望响应是一系列独特的城市名称。无论如何,这是我正在研究的代码:
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。我尝试从结果数组中打印一个对象,以确保我收到正确的查询,并且打印出来的城市很好。可能是什么问题呢?
答案 0 :(得分: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);
}
}
}
}
答案 1 :(得分:0)
我记得有点使用Parse对象,似乎有时候将它们作为对象访问(通过直接参数访问),有时候使用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
。