Javascript D3V4如何同步遍历数据
我有一个名为Javascript D3V4如何同步遍历数据,javascript,dictionary,asynchronous,d3.js,callback,Javascript,Dictionary,Asynchronous,D3.js,Callback,我有一个名为states的数组,它是一个数组数组。每个数组元素有2个项目,一个美国州名称及其缩写: states = [ ['Arizona', 'AZ'], ['Alabama', 'AL'], ['Alaska', 'AK'], ['Arkansas', 'AR'], ['California', 'CA'], ... ] 我有一个名为statesData的地图,上面有key=state的缩写。我试图使用states数组创建一个新映射,该映射的值与statesD
states
的数组,它是一个数组数组。每个数组元素有2个项目,一个美国州名称及其缩写:
states = [
['Arizona', 'AZ'],
['Alabama', 'AL'],
['Alaska', 'AK'],
['Arkansas', 'AR'],
['California', 'CA'],
...
]
我有一个名为statesData
的地图,上面有key=state的缩写。我试图使用states
数组创建一个新映射,该映射的值与statesData
相同,但键等于该州的全名:
function setStatesFullData(statesFullData, statesData) {
statesData.each(function(key, value) {
states.forEach(function(element) {
if (key == element[1]) {
statesFullData.set(element[0], value);
}
})
})
console.log(statesFullData.size());
return statesFullData;
}
var statesFullData = d3.map();
statesFullData = setStatesFullData(statesFullData, statesData);
输出:
0
这是因为变量作用域和(我相信)映射。每个和数组。forEach
都是异步函数
我目前不明白如何解决这个问题:数据必须存在于要使用的statesData.forEach
函数之外,然后数据将不存在
我认为异步开发中有一些东西我遗漏了
我可以根据要求提供更多信息。谢谢大家! 完整演示(也在下面):)
答案的底部有一个逐步的解释
const states=[
[亚利桑那州],[亚利桑那州],
阿拉巴马州,
[‘阿拉斯加’、‘AK’],
[阿肯色州],[阿肯色州],
['California','CA']
];
const statesReversed=states.map((子级,索引)=>{
return[…child.reverse()]
});
console.log(statesReversed);
const statesConversionObject=Object.fromEntries(statesReversed);
日志(statesConversionObject);
常数statesData={
“AZ”:[“一些”,“数据”],
'AL':['一些','数据'],
“AK”:[“一些”,“数据”],
'AR':['Some','Data'],
“CA”:[“一些”,“数据”]
};
const statesDataModified={};
for(让我们输入statesData){
const newKey=状态转换对象[key];
statesDataModified[newKey]=statesData[key];
}
console.log(statesDataModified);
const statesFullData=d3.map(statesDataModified);
console.log(statesFullData)
通过将状态
数组的新副本传递给映射
构造函数(键和值颠倒),可以轻松创建一个新的映射
对象,用于将状态缩写映射到其全名:
const statesMap = new Map(states.map(([name, abbr]) => [abbr, name]));
当随后从statesData
映射创建新的statesFullData
映射时,它充当解析状态名称的助手:
const statesFullData = new Map( // Create new map (full names-to-data) from...
Array.from( // ...array...
statesData, // ...from previous map (abbr-to-data)...
([abbr, data]) => [statesMap.get(abbr), data] // ...keys resolved to full name by abbreviation.
)
);
请查看以下代码片段,以获得一个可用的演示:
const states=[
[亚利桑那州],[亚利桑那州],
阿拉巴马州,
[‘阿拉斯加’、‘AK’],
[阿肯色州],[阿肯色州],
['California','CA'],
];
const statesData=新地图([
['AZ',“AZ数据”],
['AL',“AL数据”],
['AK',“AK数据”],
['AR',“AR数据”],
['CA',“CA数据”],
]);
const statesMap=newmap(states.Map([name,abbr])=>[abbr,name]);
const statesFullData=新地图(
Array.from(
州数据,
([abbr,data])=>[statesMap.get(abbr,data]
)
);
log(…statesFullData)代码>