Javascript 如何确保在运行所有其他代码之前创建数组?

Javascript 如何确保在运行所有其他代码之前创建数组?,javascript,jquery,d3.js,Javascript,Jquery,D3.js,我遇到的问题是,当我在使用的数组上调用.map时,它返回“undefined”,但当我在调用.map之前记录数组的内容时,它表示数组未定义 $(document).ready(function(){ var key = []; d3.xml("data.xml", function(error, data) { if (error) throw error; data = [].map.call(data.querySelectorAll(

我遇到的问题是,当我在使用的数组上调用.map时,它返回“undefined”,但当我在调用.map之前记录数组的内容时,它表示数组未定义

    $(document).ready(function(){
    var key = [];
    d3.xml("data.xml", function(error, data) {
        if (error) throw error;
        data = [].map.call(data.querySelectorAll("Names"), function(suspect) {
            return {
                name: suspect.querySelector("name").textContent
            }
        });
        for (var y = 0; y < data.length; y++) {
            key = Object.values(data[y]);
            LegendOptions[y] = key[0];
        };
    });

    var str1 = [null,null,null];
    var cntr = 0;
    d3.xml("data.xml", function(error, data) {
        if (error) throw error;
        data = [].map.call(data.querySelectorAll("element"), function(suspect) {
            return {
                axis: suspect.getAttribute("id"),
                value: +suspect.querySelector("value").textContent
            }
        });
        for (var y = 0; y < LegendOptions.length; y++) {
            str1 = [null,null,null]
            for (var i = 0; i < data.length/LegendOptions.length; i++) {
                str1[i] = data[cntr];
                cntr++;
            };
            d[y] = str1;
        };
    });
});
        var RadarChart = {
            draw: function(id, d, options){
                var cfg = {
                    radius: 5,
                    w: 600,
                    h: 600,
                    factor: 1,
                    factorLegend: .85,
                    levels: 3,
                    maxValue: 0,
                    radians: 2 * Math.PI,
                    opacityArea: 0.5,
                    ToRight: 5,
                    TranslateX: 80,
                    TranslateY: 30,
                    ExtraWidthX: 100,
                    ExtraWidthY: 100,
                    color: d3.scale.category10()
                };

                if('undefined' !== typeof options){
                    for(var i in options){
                        if('undefined' !== typeof options[i]){
                            cfg[i] = options[i];
                        }
                    }
                }
                cfg.maxValue = Math.max(cfg.maxValue, d3.max(d, function(i){return d3.max(i.map(function(o){return o.value;}))}));
                console.log(d);
                var allAxis = (d[0].map(function(i, j){return i.axis}));
$(文档).ready(函数(){
var键=[];
xml(“data.xml”,函数(错误,数据){
如果(错误)抛出错误;
data=[].map.call(data.querySelectorAll(“名称”),函数(可疑){
返回{
名称:可疑.querySelector(“名称”).textContent
}
});
对于(变量y=0;y
最后一行是调用.map的位置,我从中得到未定义的错误。此外,数组“d”存储在另一个文档中,该文档稍后在html文件中调用

    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
            <title>Radar chart</title>
            <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
    <script src="http://d3js.org/d3.v3.min.js"></script>
    <script src="RadarChart.js"></script>
    <style>
    body {
        overflow: hidden;
        margin: 0;
        font-size: 18px;
        font-family: "Helvetica Neue", Helvetica;
    }

    #chart {
        position: absolute;
        top: 200px;
        left: 100px;
    }   
    </style>
</head>
<body>
    <div id="body">
        <div id="chart"></div>
    </div>
    <div data-role="fieldcontain" class="ui-hide-label" id="langDiv"></div>
    <script type="text/javascript" src="script.js"></script>

</body>
</form>
</html>

雷达图
身体{
溢出:隐藏;
保证金:0;
字号:18px;
字体系列:“Helvetica Neue”,Helvetica;
}
#图表{
位置:绝对位置;
顶部:200px;
左:100px;
}   

RadarChart.js是引发错误的文件,调用了where.map。

等待
d
填充的一个可能解决方案是使用异步加载承诺

在下面,我将这两个
d3.xml()
组合在一起,因为这对我来说似乎很有意义

var dataLoaded = new Promise(function(resolve, reject) {
    $(document).ready(function() {
        var tdata = [];
        var cntr = 0;
        d3.xml("data.xml", function(error, data) {
            if (error) {
                reject(error);
            }
            //
            [].forEach.call(data.querySelectorAll("Names"), function(suspect) {
                return {
                    name: suspect.querySelector("name").textContent
                }
            }).forEach(function(item) {
                var key = Object.values(item);
                LegendOptions[y] = key[0];
            };
            //
            var tdata = [].map.call(data.querySelectorAll("element"), function(suspect) {
                return {
                    axis: suspect.getAttribute("id"),
                    value: +suspect.querySelector("value").textContent
                }
            });
            LegendOptions.forEach(function() {
                var str1 = [null, null, null];
                for (var i = 0; i < tdata.length / LegendOptions.length; i++) {
                    str1[i] = tdata[cntr];
                    cntr++;
                };
                d[y] = str1;
            });
            //
            resolve(d);
        });
    });
});

所以,
d
是一个数组……但是
d[0]
和数组吗?这一行
d[y]=str1;
是否有一个名为
d
的全局变量?d是一个全局变量,d[0]是一个数组so,
console.log(array.isArray(d[0])
其中有
console.log(d)
输出
true
?不,它输出false,但据我所知,在d[0]处有一个数组。我非常感谢你。这个问题困扰了我这么久,你能抽出时间来帮助我,真是太好了。通过一点小的修补,我完全实现了它。
var RadarChart = {
    draw: function(id, d, options) {
        dataLoaded.then(function() {
            var cfg = {
                radius: 5,
                w: 600,
                h: 600,
                factor: 1,
                factorLegend: .85,
                levels: 3,
                maxValue: 0,
                radians: 2 * Math.PI,
                opacityArea: 0.5,
                ToRight: 5,
                TranslateX: 80,
                TranslateY: 30,
                ExtraWidthX: 100,
                ExtraWidthY: 100,
                color: d3.scale.category10()
            };

            if ('undefined' !== typeof options) {
                for (var i in options) {
                    if ('undefined' !== typeof options[i]) {
                        cfg[i] = options[i];
                    }
                }
            }
            cfg.maxValue = Math.max(cfg.maxValue, d3.max(d, function(i) {
                return d3.max(i.map(function(o) {
                    return o.value;
                }))
            }));
            console.log(d);
            var allAxis = (d[0].map(function(i, j) {
                return i.axis
            }));
            //... you didn't post any more than this
        });
    }
}