【问题标题】:Handling multiple javascript objects inside plugin处理插件内的多个 javascript 对象
【发布时间】:2017-02-03 08:41:51
【问题描述】:

我创建了一个简单的 javascript 插件,它允许我从特定的 html 元素中收集数据。一个页面可以有 x 个元素(通常最多 20 个),每个元素都有自己的设置。我的问题是返回的对象不是有效的 JSON 格式,因为我收到错误“多个 JSON 根元素”。

我认为原因是因为我在插件中使用的每个函数,它为每个对象创建一个新对象,我试图解决这个问题;结果不好。

所有帮助将不胜感激,在此先感谢!

示例插件

(function($) {

$.fn.collect_data = function() {


    this.each(function() {

        var id = "#" + ($(this).attr("id"));

        // Get numerical value of id
        var get_package_id = function() {
            var package_id = id.replace(/[^0-9]/g, '');
            return package_id;
        }       

        // Packages is the top level container
        var get_packages = function() {
            var packages = {};

            packages = ({[get_package_id()]: {}});
            return packages;
        }


        // Demo information for each invidual package
        var get_package_info = function() {
            var info = {};

            $(id).each(function() {

                info = ({
                    value: 'Some value', 
                    another_value: 'Another value'
                });
            });

            return info;
        }

        // Demo information for each invidual package
        var get_more_info = function() {
            var more_info = {};

            $(id).each(function() {

                more_info = ({
                    value_more_info: 'Some value', 
                    another_value_more_info: 'Another value'
                });
            });

            return more_info;
        }           

        // Combine the demo information
        var result = function() {

            var packages = get_packages();
            var info = get_package_info();
            var more_info = get_more_info();

            packages[get_package_id()].info = info;
            packages[get_package_id()].more_info = more_info;

            return packages;
        }

        $("#show-data").append(JSON.stringify(result(), null, 2));

    });
    return this; 
}

}(jQuery));     

无效结果

                {
  "33": {
    "info": {
      "value": "Some value",
      "another_value": "Another value"
    },
    "more_info": {
      "value_more_info": "Some value",
      "another_value_more_info": "Another value"
    }
  }
}{
  "74": {
    "info": {
      "value": "Some value",
      "another_value": "Another value"
    },
    "more_info": {
      "value_more_info": "Some value",
      "another_value_more_info": "Another value"
    }
  }
}{
  "99": {
    "info": {
      "value": "Some value",
      "another_value": "Another value"
    },
    "more_info": {
      "value_more_info": "Some value",
      "another_value_more_info": "Another value"
    }
  }
}{
  "124": {
    "info": {
      "value": "Some value",
      "another_value": "Another value"
    },
    "more_info": {
      "value_more_info": "Some value",
      "another_value_more_info": "Another value"
    }
  }
}{
  "124": {
    "info": {
      "value": "Some value",
      "another_value": "Another value"
    },
    "more_info": {
      "value_more_info": "Some value",
      "another_value_more_info": "Another value"
    }
  }
}

所有数据可能都应该位于顶级 {} 容器中,而不是每个对象都添加到它们自己的 {} 中。

提前感谢所有帮助

【问题讨论】:

    标签: javascript jquery json object


    【解决方案1】:

    谈论完全过度设计的代码。所有那些只被调用一次的函数有什么意义?为什么要制作一个你不能重复使用的插件?

    让我们把你的代码压缩成它的实际作用:

    var data = $("foo").map(function () {
        return {
            package_id: "#" + this.id.replace(/[^0-9]/g, ''),
            info: {
                value: 'Some value', 
                another_value: 'Another value'
            },
            more_info: {
                value_more_info: 'Some value', 
                another_value_more_info: 'Another value'
            }
        };
    }).toArray();
    
    $("#show-data").text(JSON.stringify(data, null, 2));
    

    旁注:

    不要使用这样的数据结构:

    {
       "uniqueID1": {"some": "data"},
       "uniqueID2": {"some": "data"},
       "uniqueID3": {"some": "data"}
    }
    

    这是滥用对象作为数组。

    在这种情况下,您真正​​想要创建的是一个数组。这将使所有相关方的生活更加更轻松。

    [
       {"id": "uniqueID1", "some": "data"},
       {"id": "uniqueID2", "some": "data"},
       {"id": "uniqueID3", "some": "data"}
    ]
    

    【讨论】:

    • 嘿 Tomalak,插件是用于学习目的,因为我想了解它们是什么以及如何使用它们。另外,我的想法是我可以在其他页面上使用该插件并使其更加通用。但是,您的建议非常好,非常感谢。我会看看它如何适应这个特定的需求。感谢您提供好的建议:)
    • 您也可以在我的示例中重复使用该函数。只需从.map() 中提取它并为其命名。您的情况不是插件的好用例。插件应该以某种方式操作 DOM,否则它们毫无意义。
    • @Griphon 您的主要错误是尝试通过字符串连接构建 JSON(将文本附加到 HTML 元素是同一件事)。不要那样做。构建数据结构(对象、数组、对象数组等)。将其转换为 JSON 是 最后 步骤,仅在您通过网络发送或保存在某处之前直接完成。 JSON 应该被认为是不可变的。不要附加到它,不要在其中搜索和替换,它只是为了存储或传输。您想要进行的任何更改都需要解析 JSON,更改数据结构,并将更改后的数据结构再次转换回 JSON。
    • 这是非常好的信息,但我并不知道。这对将来学习更好的练习有很大帮助。感谢所有帮助,因为它解决了问题。我会将此帖子标记为已回答:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 2012-05-30
    • 2016-10-02
    相关资源
    最近更新 更多