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)