【问题标题】:Finding row and column of a multidimensional array in javascript在javascript中查找多维数组的行和列
【发布时间】:2018-03-14 10:21:26
【问题描述】:

我在 javascript 中这样定义了一个数组:

var chessboard = []; 
chessboard.push(["a1", "b1", "c1","d1","e1","f1","g1","h1"]);
chessboard.push(["a2", "b2", "c2","d2","e2", "f2","g2","h2"]);
chessboard.push(["a3", "b3", "c3","d3","e3", "f3","g3","h3"]);
chessboard.push(["a4", "b4", "c4","d4","e4", "f4","g4","h4"]);
chessboard.push(["a5", "b5", "c5","d5","e5", "f5","g5","h5"]);
chessboard.push(["a6", "b6", "c6","d6","e6", "f6","g6","h6"]);
chessboard.push(["a7", "b7", "c7","d7","e7", "f7","g7","h7"]);
chessboard.push(["a8", "b8", "c8","d8","e8", "f8","g8","h8"]);

我正在努力寻找的是如果元素被传递,如何找到索引。

示例:如果我通过“a5”,程序应该能够告诉我 (row,column) 为 (4,0)

**CODE:**
<!DOCTYPE html>
<html>
<head>
<title>Javascript Matrix</title>
</head>
<body>
<script>
var chessboard = [];
chessboard.push(["a1", "b1", "c1","d1","e1", "f1","g1","h1"]);
chessboard.push(["a2", "b2", "c2","d2","e2", "f2","g2","h2"]);
chessboard.push(["a3", "b3", "c3","d3","e3", "f3","g3","h3"]);
chessboard.push(["a4", "b4", "c4","d4","e4", "f4","g4","h4"]);
chessboard.push(["a5", "b5", "c5","d5","e5", "f5","g5","h5"]);
chessboard.push(["a6", "b6", "c6","d6","e6", "f6","g6","h6"]);
chessboard.push(["a7", "b7", "c7","d7","e7", "f7","g7","h7"]);
chessboard.push(["a8", "b8", "c8","d8","e8", "f8","g8","h8"]);
alert(chessboard[0][1]); // b1
alert(chessboard[1][0]); // a2
alert(chessboard[3][3]); // d4
alert(chessboard[7][7]); // h8
</script>
</body>
</html>

这就是我现在的位置。

EDIT2:

非常感谢大家:) 我感到很高兴。

似乎有多种方法! 我想做的是这个>> 找出两个正方形的(行,列)。 例子: 广场 1:a4
方格 2:c7

||x,y|| = row1-row2, column1-column2

现在从另一个 8x8 矩阵/数组中找出 (x,y)。 并显示来自矩阵(x,y)的数据。

【问题讨论】:

  • 你能分享一下你尝试过但失败的代码吗?
  • 让我更新问题
  • 我的意思是.... a5 已经告诉你它在哪一行/哪一列,只是通过名称。只需将 A 翻译成 1,B 翻译成 2 等,就完成了
  • 我要做的是——让程序找出两个正方形的行和列。示例:a4 和 e8 将 > (0,3) 和 (4,7) 并使用此数据来计算其他内容。
  • 非常感谢大家 :) 非常有帮助 :D

标签: javascript arrays matrix multidimensional-array


【解决方案1】:

由于它是棋盘,您可以从元素本身获取信息,而无需迭代棋盘:

function findCoo(el) {
  return [
    el[1] - 1, // the row value - 1
    el[0].codePointAt() - 'a'.codePointAt() // the column ascii value - ascii value of a
  ];
}

console.log("a5", findCoo("a5"));
console.log("d6", findCoo("d6"));
alert("a5" + ' ' + findCoo("a5"));

【讨论】:

  • 将 console.log 替换为 alert 并感到困惑。作品:) 有趣的想法。
  • 我已经为你添加了一个提醒 :)
  • 是否可以将 funcoo(x) 的输出存储到行和列的两个变量中?
  • 你不能从一个方法中返回两个变量,但是你可以通过array destructuring - var [r, c] = findCoo("a5")来实现。
  • 谢谢 :) var [col1,row1] = findCoo("a5"); alert(row1) //0 alert(col1) //4 var [col2,row2] = findCoo("c7"); alert(row2) //2 alert(col2) //6 //到目前为止一切顺利 //我想知道如何使下面的代码工作。 var k.row = row1 - row2; var k.col = col1 - col2;警报(k.row)警报(k.col)
【解决方案2】:

为了经常使用,我建议取一个带有位置的对象,然后只返回一个包含所需字段坐标的数组。

var chessboard = [["a1", "b1", "c1", "d1", "e1", "f1", "g1", "h1"], ["a2", "b2", "c2", "d2", "e2", "f2", "g2", "h2"], ["a3", "b3", "c3", "d3", "e3", "f3", "g3", "h3"], ["a4", "b4", "c4", "d4", "e4", "f4", "g4", "h4"], ["a5", "b5", "c5", "d5", "e5", "f5", "g5", "h5"], ["a6", "b6", "c6", "d6", "e6", "f6", "g6", "h6"], ["a7", "b7", "c7", "d7", "e7", "f7", "g7", "h7"], ["a8", "b8", "c8", "d8", "e8", "f8", "g8", "h8"]],
    positions = Object.create(null); // empty object without prototypes

chessboard.forEach(function (a, i) {
    a.forEach(function (b, j) {
        positions[b] = [i, j];
    });
});

console.log(positions['a5']); // [4, 0]
console.log(positions);
.as-console-wrapper { max-height: 100% !important; top: 0; }

要获取字段名称,您可以使用Number#toString,字母基数为36

function getField(i, j) {
    return (j + 10).toString(36) + (i + 1).toString(10);
}

console.log(getField(4, 0)); // 'a5'
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 谢谢 :) 我有疑问。这样做的相反方式是什么。示例:我的位置为 4,0 如何获得正方形名称(a5)?
【解决方案3】:

你可以试试这样的:

逻辑:

  • 循环遍历所有数组 chessBoard 并遍历每一行。
  • 检查值是否存在于行中。
    • 如果是,则将行作为迭代器返回,将列作为索引返回

var chessboard = []; 
chessboard.push(["a1", "b1", "c1","d1","e1","f1","g1","h1"]);
chessboard.push(["a2", "b2", "c2","d2","e2", "f2","g2","h2"]);
chessboard.push(["a3", "b3", "c3","d3","e3", "f3","g3","h3"]);
chessboard.push(["a4", "b4", "c4","d4","e4", "f4","g4","h4"]);
chessboard.push(["a5", "b5", "c5","d5","e5", "f5","g5","h5"]);
chessboard.push(["a6", "b6", "c6","d6","e6", "f6","g6","h6"]);
chessboard.push(["a7", "b7", "c7","d7","e7", "f7","g7","h7"]);
chessboard.push(["a8", "b8", "c8","d8","e8", "f8","g8","h8"]);

function findPosition(str){
  for(var i = 0; i< chessboard.length; i++) {
    var index = chessboard[i].indexOf(str);
    if(index>=0) {
      return "row: " + i + ", col: " + index;
    }
  }
}

console.log(findPosition('a5'));
console.log(findPosition('d5'));

【讨论】:

    【解决方案4】:

    由于您存储的是棋盘,因此无需遍历数组中的所有元素并进行搜索,您可以向chessboard 添加一个方法并通过一些简单的计算返回[row,column]

    let chessboard = [["a1", "b1", "c1", "d1", "e1", "f1", "g1", "h1"], ["a2", "b2", "c2", "d2", "e2", "f2", "g2", "h2"], ["a3", "b3", "c3", "d3", "e3", "f3", "g3", "h3"], ["a4", "b4", "c4", "d4", "e4", "f4", "g4", "h4"], ["a5", "b5", "c5", "d5", "e5", "f5", "g5", "h5"], ["a6", "b6", "c6", "d6", "e6", "f6", "g6", "h6"], ["a7", "b7", "c7", "d7", "e7", "f7", "g7", "h7"], ["a8", "b8", "c8", "d8", "e8", "f8", "g8", "h8"]]
    
    chessboard.findEl = (input) => ([input[1]-1 ,input[0].charCodeAt(0)-97])
    
    console.log(chessboard.findEl("a5"))
    console.log(chessboard.findEl("b4"))

    【讨论】:

    • 如果尚未涵盖,请检查其他答案(Ori's)。
    • @Rajesh Mine 与 Ori 的不同,因为 (a) 我在 chessboard 中添加了一个成员方法,而不是声明一个独立的函数来进行搜索,并且 (b) 我写的是一个箭头方法这提供了更清晰的语法。请先核对答案,做比较后再做判断。
    • @Rajesh 首先,就像你说的,最好让消费者来实施,这样消费者的做法就超出了你我的范围。其次,我给出的只是一个实现,我没有任何收获(除非我真的在争取投票之类的东西),更不用说与其他人竞争了。第三,我在写自己的答案时实际上并没有看到 Ori 的答案,但话又说回来,一个好的答案不是仅仅通过逻辑来判断的。最后但并非最不重要的一点是,我可以想到多种场景,我的解决方案可以成为更好的实践。也许是个人喜好,但我也保持了我的代码质量。
    【解决方案5】:

    试试这个

    function getElement(val){
    var result;
      for(var i=0;i<chessboard.length;i++){
             result=chessboard[i].indexOf(val);
         if(result!=-1){
            result='[' + i+',' + result + ']';
            break;
         }
      }
      return result;
    }
    
    console.log(getElement("a5"));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-05
      • 2013-04-12
      • 2013-01-25
      • 2017-10-11
      • 2018-06-17
      • 2015-04-26
      相关资源
      最近更新 更多