【问题标题】:How to remove last element from every row of a matrix in javascript如何从javascript中的矩阵的每一行中删除最后一个元素
【发布时间】:2020-06-27 07:28:45
【问题描述】:

我正在尝试从 javascript 中的矩阵的每一行中删除最后一个元素。我正在尝试使用“地图”功能,但没有成功。

这是我的代码:

var matrixWithExtraInfo = [
  [1, 2, 3, 4, "dog"],
  [5, 6, 7, 8, "dog"],
  [9, 10, 11, 12, "dog"],
  [13, 14, 15, 16, "dog"],
  [17, 18, 19, 20, "dog"]
];

var conciseMatrix = [
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9, 10, 11, 12],
  [13, 14, 15, 16],
  [17, 18, 19, 20]
]

var conciseMatrix = matrixWithExtraInfo.map(function(index) {
  console.log(index)
  matrixWithExtraInfo[index].pop();
  return matrixWithExtraInfo[index];
});
console.log(matrixWithExtraInfo);

我明白了

TypeError: 无法读取未定义的属性“pop”

【问题讨论】:

  • map 将返回项目而不是第一个参数中的索引 - 当我让你成为 sn-p 时,我添加了一个控制台日志

标签: javascript arrays matrix multidimensional-array


【解决方案1】:

.map 的第一个参数是您正在迭代的项目,而不是索引。

由于这里的每个项目都是一个数组,您可以.pop 数组(将改变现有数组),或.slice 数组(不会改变现有数组) .

var matrixWithExtraInfo = [
    [1,2,3,4,"dog"],
    [5,6,7,8,"dog"],
    [9,10,11,12,"dog"],
    [13,14,15,16,"dog"],
    [17,18,19,20,"dog"]
];

var conciseMatrix = [
    [1,2,3,4],
    [5,6,7,8],
    [9,10,11,12],
    [13,14,15,16],
    [17,18,19,20]
]

var conciseMatrix = matrixWithExtraInfo.map((arr) => {
  arr.pop();
  return arr;
});
console.log(matrixWithExtraInfo);
console.log(conciseMatrix);

(上面是奇怪的 - 你需要的结构已经在matrixWithExtraInfo,让另一个变量来保存它是令人困惑的,但这是最接近你的原始代码)

var matrixWithExtraInfo = [
    [1,2,3,4,"dog"],
    [5,6,7,8,"dog"],
    [9,10,11,12,"dog"],
    [13,14,15,16,"dog"],
    [17,18,19,20,"dog"]
];

var conciseMatrix = [
    [1,2,3,4],
    [5,6,7,8],
    [9,10,11,12],
    [13,14,15,16],
    [17,18,19,20]
]

var conciseMatrix = matrixWithExtraInfo.map(arr => arr.slice(0, -1));
console.log(matrixWithExtraInfo);
console.log(conciseMatrix);

【讨论】:

  • 是的你可以 .pop 数组(这将改变现有数组),或者 .slice 数组(这不会改变现有数组)。第一个代码是由于突变并创建了另一个变量名而很奇怪,但它最接近 OP 的原始代码
  • 如果我们不想修改原始矩阵,我们应该使用 slice 代替 pop。
【解决方案2】:

Map 将返回元素,因此通过迭代所有行,我们只需弹出将从每一行中删除最后一个元素的元素。由于我们需要不同数组中的新矩阵,我们应该使用切片(不是弹出/拼接),它将返回新数组中的元素而不修改原始矩阵。

var matrixWithExtraInfo = [
    [1,2,3,4,"dog"],
    [5,6,7,8,"dog"],
    [9,10,11,12,"dog"],
    [13,14,15,16,"dog"],
    [17,18,19,20,"dog"]
];

var conciseMatrix = [
    [1,2,3,4],
    [5,6,7,8],
    [9,10,11,12],
    [13,14,15,16],
    [17,18,19,20]
]

var conciseMatrix = matrixWithExtraInfo.map(row => row.slice(0, row.length-1));
console.log(matrixWithExtraInfo);
console.log(conciseMatrix);

【讨论】:

    【解决方案3】:

    如果你想改变现有数组,一个简单的方法是使用Array.forEach()Array.pop() 应用于每个元素:

    var matrixWithExtraInfo = [
      [1, 2, 3, 4, "dog"],
      [5, 6, 7, 8, "dog"],
      [9, 10, 11, 12, "dog"],
      [13, 14, 15, 16, "dog"],
      [17, 18, 19, 20, "dog"]
    ];
    
    matrixWithExtraInfo.forEach(arr => arr.pop());
    console.log(matrixWithExtraInfo);

    否则,只需使用Array.slice()

    var matrixWithExtraInfo = [
      [1, 2, 3, 4, "dog"],
      [5, 6, 7, 8, "dog"],
      [9, 10, 11, 12, "dog"],
      [13, 14, 15, 16, "dog"],
      [17, 18, 19, 20, "dog"]
    ];
    
    var conciseMatrix = matrixWithExtraInfo.map(arr => arr.slice(0, -1));
    console.log(conciseMatrix);

    【讨论】:

      【解决方案4】:

      只需在代码中的 map 函数中添加 _, 即可修复。 function(_,index)

      var matrixWithExtraInfo = [
        [1, 2, 3, 4, "dog"],
        [5, 6, 7, 8, "dog"],
        [9, 10, 11, 12, "dog"],
        [13, 14, 15, 16, "dog"],
        [17, 18, 19, 20, "dog"]
      ];
      
      var conciseMatrix = [
        [1, 2, 3, 4],
        [5, 6, 7, 8],
        [9, 10, 11, 12],
        [13, 14, 15, 16],
        [17, 18, 19, 20]
      ]
      
      var conciseMatrix = matrixWithExtraInfo.map(function(_,index) {
        console.log(index)
        matrixWithExtraInfo[index].pop();
        return matrixWithExtraInfo[index];
      });
      console.log(matrixWithExtraInfo);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-26
        • 2014-08-22
        • 1970-01-01
        • 2016-08-24
        • 1970-01-01
        • 2012-04-15
        相关资源
        最近更新 更多