如何在自引用对象字面量中更新动态属性?JS实现DLX遇阻
嘿,我懂你在实现DLX算法时遇到的这个麻烦——在构建节点的自引用邻接关系时,直接遍历赋值肯定会出问题,毕竟当你处理某个位置时,它的上下左右邻居可能还没被创建出来呢!咱们来一步步解决这个问题:
核心思路
要解决这个自引用对象的问题,我们得分两步走:
- 先批量创建所有节点:遍历矩阵,把每个
1替换为带基础信息的节点对象(先不处理邻接引用),0保持不变,将这些节点暂存在一个二维数组中。 - 补全邻接引用:再次遍历每个节点,根据坐标找到上下左右相邻的
1对应的节点,直接引用这些已经存在的节点对象,完成邻接属性的赋值。
完整实现代码
export const constructDataObjects = matrix => { const totalRows = matrix.length; if (totalRows === 0) return []; const totalCols = matrix[0].length; // 第一步:初始化所有节点,先存到nodes数组里,邻接属性后续补全 const nodes = Array.from({ length: totalRows }, (_, rowIdx) => Array.from({ length: totalCols }, (_, colIdx) => { if (matrix[rowIdx][colIdx] === 1) { return { row: rowIdx, col: colIdx, u: null, // 上邻节点 d: null, // 下邻节点 l: null, // 左邻节点 r: null // 右邻节点 }; } return 0; // 非1的位置保留原0值 }) ); // 第二步:遍历每个节点,补全邻接引用 for (let i = 0; i < totalRows; i++) { for (let j = 0; j < totalCols; j++) { const current = nodes[i][j]; if (current === 0) continue; // 跳过非1的位置 // 处理上方邻接 if (i > 0) { current.u = nodes[i-1][j] !== 0 ? nodes[i-1][j] : null; } // 处理下方邻接 if (i < totalRows - 1) { current.d = nodes[i+1][j] !== 0 ? nodes[i+1][j] : null; } // 处理左方邻接 if (j > 0) { current.l = nodes[i][j-1] !== 0 ? nodes[i][j-1] : null; } // 处理右方邻接 if (j < totalCols - 1) { current.r = nodes[i][j+1] !== 0 ? nodes[i][j+1] : null; } } } return nodes; };
关键细节说明
- 避免引用未定义:先创建所有节点再补全引用,确保我们要引用的邻接节点已经存在于
nodes数组中,不会出现undefined的情况。 - 适配非方阵:代码中用
totalCols = matrix[0].length获取列数,兼容行数和列数不同的矩阵(你的原代码里用matrix.length作为列数,这只适用于方阵,容易出bug)。 - DLX循环链表扩展(可选):如果你的DLX实现需要循环链表结构(比如列头的上下循环、行的左右循环),可以在补全引用时调整逻辑——比如当当前节点是列的第一个节点时,
u指向列的最后一个节点;行的第一个节点的l指向行的最后一个节点,以此类推。
内容的提问来源于stack exchange,提问作者Red Mercury
相关产品推荐
相关产品推荐

