JavaScript:在索引处操作矩阵行

JavaScript: Manipulate matrix row at index

我正在尝试解决这个问题:

我似乎什么都懂,除了:在特定索引处操作矩阵的行。我编写的代码在所有行执行该功能,而不是指定的行。

代码如下:

const solvematrix= (r, c, indices) => {
    let matrix = new Array(r).fill(new Array(c).fill(0));

    for (let i = 0; i < indices.length; i++) {
        // get index values to increase
        let rIdx = indices[i][0];
        let cIdx = indices[i][1];

        // modify row matrix in-place ; This is where the Error is
        matrix[rIdx].map((cv, idx, array) => array[idx]++);

        // modify column matrix in-place
        matrix[cIdx].map((cv, idx, array) => (cIdx === idx ? array[idx]++ : null));
    }

    return matrix;
};


solvematrix(2, 3, [[0, 1],[1, 1]])
Output: [[2,4,2],[2,4,2]]
Expected: [[1,3,1],[1,3,1]]

正如您在上面的输出中看到的那样,行中所有数字的值都会增加,而不仅仅是特定行。

我在 repl 上 运行 这个,我得到了预期的输出。我遇到的唯一错误是调用 oddCells 时。您在那里缺少右括号。只需将其更新为 oddCells(2, 3, [[0, 1], [1, 1]]).

虽然我不能说我完全理解你要解决的问题。根据您的描述,预期的输出对我来说甚至似乎是错误的。我们不应该只增加每个特定索引对的值吗?如果是这样的话,对于这个例子,输出不会像这样:

[[0, 1, 0],[0, 1, 0]]

***** 编辑 *****

感谢您的澄清。所以我又看了一眼,这是一个棘手的问题。一些事情。

  1. 使用 new Array 创建数组时存在一些问题。影响我们的问题是它似乎只创建一个对象,一个引用。因此,即使您在矩阵中创建了多行,所有这些行实际上都是相同的底层对象。如果您在控制台记录这些行,您会看到在第一次迭代之后,我们也更新了第二行。这个站点对于了解事物很有用:https://2ality.com/2018/12/creating-arrays.html。这是棘手的部分!

所以第一个解决方法是改变它,而是使用 Array.from 每次都会创建一个 b运行d 新数组。

  1. 您遇到的第二个问题是更新列时。您试图迭代 matrix[cIdx],它可以是任何行。这不会拉出您要更新的列。要更新特定列,您必须执行类似
  2. 的操作

matrix[rowIdx][colIdx] = somevalue

这里重写:

const oddCells = (r, c, indices) => {
    let matrix = Array.from({length: r}, () => Array.from({length: c}, () => 0));
    for (let i = 0; i < indices.length; i++) {
        // get index values to increase
        let rIdx = indices[i][0];
        let cIdx = indices[i][1];
        // update rows
        matrix[rIdx] = matrix[rIdx].map(v => v++); 
        // update columns
        matrix.forEach((row, idx) => row[cIdx]++);
    }

    return matrix;
};


oddCells(2, 3, [[0, 1],[1, 1]]);

另外,顺便说一句。您使用 .map 的方式有点反模式。通常,如果你想直接改变某些东西,你可以使用 .forEach.map returns 每次更新一个新数组。因此,通常您只需将值设置为该新数组即可。