Как удалить последний элемент из каждой строки матрицы в javascript - PullRequest
0 голосов
/ 16 марта 2020

Я пытаюсь удалить последний элемент из каждой строки матрицы в 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' из неопределенного

Ответы [ 4 ]

3 голосов
/ 16 марта 2020

Первый аргумент .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);
1 голос
/ 16 марта 2020

Если вы хотите изменить существующий массив, проще всего использовать 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);
1 голос
/ 16 марта 2020

Map вернет элемент, поэтому, перебирая все строки, мы просто выталкиваем элемент, который удаляет последний элемент из каждой строки. Поскольку нам нужна новая матрица в другом массиве, мы должны использовать слайс (не pop / splice), который будет возвращать элементы в новом массиве и не изменять исходную матрицу.

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);
0 голосов
/ 16 марта 2020

Просто добавив _, в карту функции в вашем коде должно исправить. 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);
...