如何在Javascript中动态创建循环引用对象?

时间:2018-04-22 20:32:34

标签: javascript algorithm

我试图在Javascript中实现DLX,而且我遇到了构建循环引用的问题。

这个函数采用二进制矩阵并返回一个矩阵,其中每个' 1'矩阵的一个对象引用它的关闭' 1'在所有基本方向。

export const constructDataObjects = matrix => {
  for (let i = 0; i < matrix.length; i++) {
    for (let j = 0; j < matrix.length; j++) {
      let u = j - 1;
      let d = j + 1;
      let l = i - 1;
      let r = i + 1;

      if (matrix[i][j] === 0) continue;

      // Check edge cases.
      if (u < 0) u = matrix.length - 1;
      if (d >= matrix.length) d = 0;
      if (l < 0) l = matrix.length - 1;
      if (r >= matrix.length) r = 0;

      // Increment and decrement directions and bound check.
      // On hitting a bound, circle around and start from the other side.
      while (matrix[i][u] === 0) u = u - 1 < 0 ? matrix.length - 1 : u - 1;
      while (matrix[i][d] === 0) d = d + 1 >= matrix.length ? 0 : d + 1;
      while (matrix[l][j] === 0) l = l - 1 < 0 ? matrix.length - 1 : l - 1;
      while (matrix[r][j] === 0) r = r + 1 >= matrix.length ? 0 : r + 1;
      matrix[i][j] = {
        u: matrix[i][u],
        d: matrix[i][d],
        l: matrix[l][j],
        r: matrix[r][j],
      };
    }
  }

  return matrix;
};

我相信这个问题可以简化为:

let a = arr => {
  for(let i = 0; i < arr.length; i++) {
    n[i] = {
      curr: arr[i],
      first: arr[0],
    }
  }
  return arr
}

现在

a([1,2])

可生产

[ { curr: 1, first: 1 },
  { curr: 2, first: { curr: 1, first: 1 } } ]

我想要的是

[ { curr: 1, first: { curr: 1, first: 1 } } },
  { curr: 2, first: { curr: 1, first: 1 } } ]

如何在分配时将first: arr[0]分配给a[0]对象的引用而不是a[0]的值?

我意识到了

n[i] = {
  curr: arr[i],
  first: arr[0],
}
n[i].first = n[0]

会起作用,但我没有看到在constructDataObjects中工作,因为在遍历所有元素之前不知道这些关系。

0 个答案:

没有答案