2014-07-17 2 views
8

У меня есть 2D массив:Удаление столбца из многомерного массива в JavaScript

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

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

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

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

Спасибо!

+0

Итак, вы получите "[[" a "," b "], [" a "," b "], [" a "," b "]]'? –

+1

Я предлагаю вам провести еще несколько исследований, я имею в виду, что вам нужно преобразовать ** 2 строки ** кода: 'foreach ($ array as & $ element) {$ element = array_slice ($ element, 0, MAX);}' , Покажите нам, что вы пробовали до сих пор. – elclanrs

+1

Вы хотите удалить, например. третий элемент в каждом ... (усечение длины внутренних массивов)? или вы хотите установить его в null или пустую строку? - Непонятно. – scunliffe

ответ

16

Попробуйте использовать slice.Это не приведет к изменению каких-либо изменений в исходный array

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

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

Итерация через массив и соединить каждый вспомогательный массив:

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

JSFiddle.

Редактировать: Я вижу, что вы не хотите использовать сплайсинг для решения проблем и изменения длины массива. So:

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]); 
     } 
    } 
} 

New JSFiddle.

+2

Относительно его «вне границ», вы могли бы просто удалить индексы в порядке убывания ... То есть, начинайте с * наивысшего * индекса, чтобы удалять и просто работать вниз. –

+0

Yup, это хороший подход :). –

1

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/

2

использовать 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 для удаления элементов из массива яваскрипта. причина в том, что 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 это устанавливает правильную длину и удалить элемент массива.

1

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

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

Надежда это то, что вы ищете

Смежные вопросы