TypeError: invalid 'in' operand a error when calling jQuery each inside RequireJS module

TypeError: invalid 'in' operand a error when calling jQuery each inside RequireJS module

我有以下 RequireJS 模块,我用它来使用 AmCharts 构建图表。 (为简洁起见,我删除了一些代码)。

define('admin/stats', ['jquery', 'amcharts.serial'], function($, AmCharts) {

    var historicalStats = {

        init: function(rawData, axesMarker) {

            var originalData = rawData,
            charts = $('#charts');

            console.log(originalData);

            $.each(originalData, function(graphName, config) {
                // ...call a function in here...
            });

        }

    };

    return historicalStats;

});

我是这样称呼它的:

<script type="text/javascript">

    require(['admin/stats'], function(stats) {
        stats.init('{{ data|raw }}', '{{ "graphs.axes.filesize"|trans({}, "admin") }}');
    });

</script>

我遇到的问题是第 $.each(originalData, function(graphName, config) { 行出现以下错误:

TypeError: invalid 'in' operand a
...w:this,function(a,b){function c(a){var b="length"in a&&a.length,c=_.type(a);retu...

(我正在使用 grunt 缩小 JavaScript)。

originalData 看起来像这样:

{"users":{"series":[{"field":"users","title":"Users"}],"type":"raw","axesMarker":"Users","data":[]},"fileusage":{"type":"filesize","axesMarker":"File size","series":[],"data":[]},"dbsize":{"series":[{"field":"dbsize","title":"Database size"}],"type":"filesize","axesMarker":"File size","data":[]}}

我通过注释掉其他所有内容,将错误追溯到那一行。那行不正确的是什么?

在这次通话中:

stats.init('{{ data|raw }}', '{{ "graphs.axes.filesize"|trans({}, "admin") }}');

你传递了一个字符串作为第一个参数。然后 $.each 尝试在这个字符串中查找 "length""length" in a(其中 a 被初始化为与传递给 stats.init 的第一个参数相同的值。

如果 {{ data|raw }} 是格式正确的 JavaScript 对象或 JSON 您可以删除引号。但是,我担心您如何在代码中将 rawData 复制到 originalData。如果你只是删除引号并得到一个 JavaScript 对象,要知道如果你在以后的代码中修改 originalData 那么 rawData 也会有相同的修改 因为你没有克隆它。因此,如果您想将它与 originalData 的更改隔离开来,您必须克隆它。 (克隆的方法有很多种,哪种最适合你的情况取决于你问题中没有的细节。)

另一种可能性是按原样保留对 stats.init 的调用,但在函数内部执行:

var originalData = JSON.parse(rawData)

这假定 {{ data|raw }} 的格式正确 JSON。