【问题标题】:Using a JavaScript Map with array as key, why can't I get the stored value?使用以数组为键的 JavaScript Map,为什么我无法获取存储的值?
【发布时间】:2018-11-19 03:05:51
【问题描述】:

我的代码初始化一个 Map 对象并使用数组作为键。当我尝试使用 map.get() 方法时,我得到“未定义”而不是我期望的值。我错过了什么?

const initBoardMap = () => {
  let theBoard = new Map()
  for (let r = 0; r < 3; r++) {
    for (let c = 0; c < 3; c++) {
      //create a Map and set keys for each entry an array [r,c]
      //set the value to a dash
      // ---- commented out the array as key :-(
      //theBoard.set([r, c], '-')
      const mykeyStr = r + ',' + c
      theBoard.set(mykeyStr, '-')
    }
  }
  return theBoard
}

const printBoardMap = theBoard => {
  for (let r = 0; r < 3; r++) {
    let row=''
    for (let c = 0; c < 3; c++) {
      //initialize an array as the map key
      // comment out array as key
      // let mapKey = [r, c]
      //
      //why can't I get the value I expect from the line below?
      //
      //let square = theBoard.get(mapKey)
      //log the value of map.get --- notice its always undefined   
      const mykeyStr = r + ',' + c
      row += theBoard.get(mykeyStr)
       if (c < 2) row += '|'
    }
    console.log(row)
  }
}
let boardMap = initBoardMap()

printBoardMap(boardMap)

【问题讨论】:

    标签: javascript node.js dictionary ecmascript-6


    【解决方案1】:

    当您将非原始对象传递给.get 时,您需要使用.set 来引用完全相同的对象。例如,在设置时,您可以:

      theBoard.set([r, c], '-')
    

    当该行运行时,创建一个数组[r, c]。然后,在printBoardMap,您的

      let mapKey = [r, c]
    

    创建另一个数组[r, c]。它们不是同一个数组;如果orig 是原始数组,mapKey !== orig

    您可以考虑改为设置和获取字符串,例如'0_2' 而不是[0, 2]

    theBoard.set(r + '_' + c, '-')
    

    const mapKey = r + '_' + c;
    

    (如果可能,最好使用const 而不是let - 仅在需要重新分配相关变量时使用let

    【讨论】:

    • 感谢CertainPerformance,我觉得这是一个价值与参考的问题。我看到我可以用一个字符串来做到这一点。如果我可以使用数组或对象当然会很好,但似乎没有办法随机访问 Map 条目,除非键是原始的?
    • 对,我想另一种方法是创建 another Map[r, c] 字符串中获取(单数)[r, c] 数组,但这只是把后面不必要的抽象背后的相同问题
    • 我首先尝试解构这个使用 _ immutable_ Map 作为板数据结构的 redux 代码 [github.com/DatGreekChick/tic-tac-toe]。啊,现在我看到坚持原始数据类型(数字)作为关键。最终它会创建: Map { 0: Map { 0: "X", 1: "O", 2: "X" }, 2: Map { 0: "O", 1: "X", 2 : "O" }, 1: 地图 { 0: "X", 1: "O", 2: "X" } }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 2017-10-21
    • 2019-10-13
    • 1970-01-01
    相关资源
    最近更新 更多