从边缘阵列创建二维阵列

时间:2019-11-08 13:12:30

标签: javascript arrays

我已经输入:

const topMatrix = [ 1, 2, 3, 4 ] ;
const leftMatrix = [ 0, 5, 10 ] ;
const rightMatrix = [ 9, 14, 19 ] ;
const bottomMatrix = [ 15, 16, 17, 18 ];

并从上面的数组中我要创建这样的数组:

[
    [1, 2, 3, 4, 9],
    [0, empty, empty, empty, 14],
    [5, empty, empty, empty, 19],
    [10, 15, 16, 17, 18]
]

因此顶部和底部几乎相同。

然后左列,我只需要从1移到最后一个(不包括0)即可。

然后右列,我只需要从0推到最后一个-1(不包括最后一个)即可。

到目前为止,我所做的是:

const topMatrix = [ 1, 2, 3, 4 ] ;
const leftMatrix = [ 0, 5, 10 ] ;
const rightMatrix = [ 9, 14, 19 ] ;
const bottomMatrix = [ 15, 16, 17, 18 ];

const combineEdges = (top, left, right, bottom) => {
  const newArray = new Array(4);
  newArray.fill(new Array(4))

  //fill top and bottom
  newArray[0] = top;
  newArray[newArray.length - 1] = bottom;

  //fill left
  for(let i = 0, l = left.length; i < l; i++) {
    if(newArray[i + 1]) {
      newArray[i + 1].unshift(left[i]);
    }
  }

  //fill right
  for(let i = 0, l = right.length; i < l; i++) {
    if(newArray[i]) {
      newArray[i].push(right[i]);
    }
  }

  return newArray;
}

console.log(
  combineEdges(topMatrix, leftMatrix, rightMatrix, bottomMatrix)
)

现在,我遇到了问题,因为我通过.fill创建了数组“虚拟”,这导致它的行为对我来说很奇怪。例如,由于某些我完全不了解的原因,该左填充循环使元素移位并复制了5。

当前输出为:

0: (5) [1, 2, 3, 4, 9]
1: (8) [5, 0, empty × 4, 14, 19]
2: (8) [5, 0, empty × 4, 14, 19]
3: (5) [10, 15, 16, 17, 18]

我不知道为什么在51中将219都加倍,显然我做错了。我认为问题在于创建新数组的方式。

有人可以解释这里发生了什么吗?

1 个答案:

答案 0 :(得分:1)

根据documentation Array.fill()使用静态组件填充数组。这意味着您用相同的数组填充数组4次。然后您在位置0和3而不是位置1和2中覆盖它。

由于这是位置1和2处的同一数组,因此您要向两个数组添加相同的数字。

您要删除

newArray.fill(new Array(4))

然后手动填充

  //fill top and bottom
  newArray[0] = top;
  newArray[1] = new Array(3);
  newArray[2] = new Array(3);
  newArray[newArray.length - 1] = bottom;

我也将其调整为新的Array(3),因为在您的示例中,中间需要3个空条目。