Javascript 如何确保在运行所有其他代码之前创建数组?
我遇到的问题是,当我在使用的数组上调用.map时,它返回“undefined”,但当我在调用.map之前记录数组的内容时,它表示数组未定义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(
$(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
});
}
}