1

我正在循环遍历二维数组以将值设置为地图。我将 [i,j] 索引存储为映射键,并将实际 arr[i][j] 值存储为映射值:

const arrMap = new Map()

for(let i = 0; i < arr.length; i++){
        for(let j = 0; j < arr[i].length; j++){
            arrMap.set([i,j],arr[i][j]);
        }
    }

在这一点上,我已经“控制台记录”了地图,它似乎已经正确设置了如下对[0,0] => "A":然后我尝试访问地图值:arrMap.get([0,0])但这返回未定义。如何从我的 arrMap 访问“A”?

我要循环的示例数组是[ ["A","B","B"],["A","A","A"] ]

这里有一个非常相似的问题- Array as a javascript map's key? 但答案对我来说没有意义。

4

5 回答 5

1

将键转换为字符串

arrMap.set([i,j].toString(),arr[i][j]);

在这里您可以迭代以获取键和值

 for(let [value,key] of arrMap){
     console.log(value)
     console.log(key)
    }

如果你想直接访问

arrMap.get('0,0')
于 2020-07-29T06:59:38.347 回答
1

您的密钥[0, 0]是引用类型。所以每次当你写同一个数组时,你都在创建一个新的引用。Map没有这样的参考,这就是你得到的原因undefined。尝试使用原始类型作为键。

您可以使用keys()方法查看Map数据结构中的所有键,然后您可以通过所需的键访问:

您可以使用原始值作为键,因为每次通过声明数组访问值时,您都在创建一个新引用。这意味着您的Map对象没有带有新引用的键:

const arrMap = new Map()

let arr = [[1, 2, 3], [4, 5, 6], [7]]

for(let i = 0; i < arr.length; i++){
        for(let j = 0; j < arr[i].length; j++){
            arrMap.set(`${i}, ${j}`,arr[i][j]);
        }
}

for (let key of arrMap.keys()) {
  console.log(`key: `, key);
  console.log(`result: `, arrMap.get(key));
}

let result = arrMap.get('0, 0');
console.log('The value by key of primitive type: ', result);

于 2020-07-29T06:52:18.403 回答
1

您所指的答案是, Map 键将是数组的键。因此,如果您有一个要设置为键的数组,它本身必须是一个数组,以便地图能够检索其键。

我为您构建了一个工作示例。

const map = new Map()
map.set([0, 0], 'A')

const keyZ = [2, 2]
map.set(keyZ, 'Z')

console.log(map.get([0, 0])) // will not find
console.log(map.get(keyZ)) // will output Z

const keyA = [0, 0]
map.set(keyA, 'A')
console.log(map.get(keyA)) // will output A

于 2020-07-29T07:09:44.730 回答
1

如果您仔细阅读另一个问题的答案,您会发现您尝试执行的操作无法正常工作,[0,0]因为您尝试获取的数组[0,0]与您设置的数组不同。您也许可以考虑对数组键进行字符串化。例如:

const arrMap = new Map();
const arr = [
  [1, 2, 3],
  [4, 5, 6]
];

for (let i = 0; i < arr.length; i++) {
  for (let j = 0; j < arr[i].length; j++) {
    arrMap.set(JSON.stringify([i, j]), arr[i][j]);
  }
}
console.log(arrMap.get(JSON.stringify([1, 1]))); // 5

于 2020-07-29T06:50:47.553 回答
1

由于对象的性质和仅相同对象引用的唯一性,您需要一个包装器来访问用于存储和检索的值。

包装器构建一个原始值(字符串)并且不依赖于对象引用。

const
    wrapper = array => array.join('|'),
    arr = [["A", "B", "B"], ["A", "A", "A"]],
    arrMap = new Map();

for (let i = 0; i < arr.length; i++) {
    for (let j = 0; j < arr[i].length; j++) {
        arrMap.set(wrapper([i, j]), arr[i][j]);
    }
}

console.log(arrMap.get(wrapper([0, 0]))); // A

于 2020-07-29T06:49:05.687 回答