Удаление столбца из многомерного массива в JavaScript

У меня есть 2D-массив:

var array = [["a", "b", "c"],["a", "b", "c"],["a", "b", "c"]]

Я хочу удалить весь столбец этого массива (т. е. удалить каждый третий элемент в каждом массиве).

есть решения здесь и здесь, но ни один из них не находится в javascript, поэтому у меня возникли проблемы, связанные с ситуациями.

Как лучше всего подойти к этой проблеме? Я не хочу использовать .splice (), потому что в некоторых случаях я буду удалять несколько столбцов и .сращивание() метод изменит длину массива, поэтому я в конечном итоге получаю доступ за пределы.

спасибо!

5 ответов


попробуйте использовать slice. Это не изменит никаких изменений в вашем оригинале array

var x = array.map(function(val){
    return val.slice(0, -1);
});

console.log(x); // [[a,b],[a,b],[a,b]]

выполните итерацию по массиву и соедините каждый под массив:

var idx = 2;
for(var i = 0 ; i < array.length ; i++)
{
   array[i].splice(idx,1);
}

JSFiddle.

редактировать: Я вижу, вы не хотите использовать splice из-за проблем вне границ и изменения длины массива. Итак:

1.Вы можете проверить, если вы вне пределов и пропустить срез.
2.Вы можете создать массив индексов, которые хотите удалить, и просто создать новые массивы из индексов, которые не отображаются в этом массиве (вместо удаление, создание новых массивов с противоположным состоянием).

что-то вроде этого:

var array = [
    ["a", "b", "c"],
    ["a", "b", "c"],
    ["a", "b", "c"]
];

var idxToDelete = [0,2];

for (var i = 0; i < array.length; i++) {
    var temp = array[i];
    array[i] = [];
    for(var j = 0 ; j < temp.length ; j++){
        if(idxToDelete.indexOf(j) == -1) // dont delete
        {
            array[i].push(temp[j]);
        }
    }
}

Новый JSFiddle.


splice это круто. Он изменяет размер массива, поскольку он удаляет вещи, поэтому вы не заканчиваете с нулями. Таким образом, используя splice, вам просто нужно перебрать каждую строку и удалить правильный элемент.

var removeCol = function(arr2d, colIndex) {
    for (var i = 0; i < arr2d.length; i++) {
        var row = arr2d[i];
        row.splice(colIndex, 1);
    }
}

http://jsfiddle.net/eB8LD/


использовать map функции splice функция для вашего решения. такой

var array = [["a", "b", "c"],["a", "b", "c"],["a", "b", "c"]];

array = array.map(function(item){
        // the 0,2 tells the splice function to remove (skip) the last item in this array
        return item.splice(0,2);
});

console.log(array);
// [["a", "b"],["a", "b"],["a", "b",]];

не используйте delete для удаления элементов из массива javascript. причина в том, что delete выбросит элемент, но не обновит внутреннюю переменную длины.

пример

var array = ["a", "b", "c"];

delete array[3];
console.log(array);
// ["a", "b"]
console.log(array.length);
// 3

array = array.splice(0,2);
console.log(array);
// ["a", "b"]
console.log(array.length);
// 2

использовать splice это устанавливает правильную длину и удаляет элемент массива.


эта функция не использует splice и удаляет любой столбец, который вы хотите:

function removeEl(array, remIdx) {
 return array.map(function(arr) {
         return arr.filter(function(el,idx){return idx !== remIdx});  
        });
};

надеюсь, это то, что вы ищете