【问题标题】:JS code returning errorJS代码返回错误
【发布时间】:2014-02-14 15:49:05
【问题描述】:

我是 JS 新手,我不得不将它用于 Cloud Code Parse 功能。我有一个名为“user_picture”的类,通过代码我查询所有对象并通过它的“城市”属性。我希望响应是一组独特的城市名称。无论如何,这是我正在处理的代码:

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。我尝试从结果数组中打印一个对象,以确保我收到了正确的查询,并且它在城市中打印得很好。可能是什么问题呢?

【问题讨论】:

  • results是什么对象?它告诉你它没有方法get。也许你的意思是object.city
  • 哪一行导致错误?
  • @ppoliani 我无法识别错误,因为代码在 Parse.com 服务器上运行。
  • @Mathletics 结果是数组类型。其中的每个对象都是字典类型(iOS 语言)。我试图返回 results[0].get("city") 它返回指定对象的城市

标签: javascript parse-platform


【解决方案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);
            }
        }
    }
}

【讨论】:

    【解决方案2】:

    我记得曾经使用 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

    【讨论】:

    • 为什么要提供一个使用特定库的示例?不需要在你的项目中包含 underscore.js 只是为了遍历一个数组。
    • 点了。我已经更新了代码 sn-p 以使用 vanilla JS。此代码仅假定包含 keys() 方法的现代 javascript (ECMAScript 5)。
    猜你喜欢
    • 2011-12-04
    • 2014-07-03
    • 2021-04-25
    • 2017-06-03
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多