Jak mogę odzyskać kolumnę z tablicy 2-wymiarowej , a nie pojedynczego wpisu? Robię to, ponieważ chcę szukać ciągów w jednej z kolumn, więc jeśli jest inny sposób na osiągnięcie tego, powiedz mi.

Używam tablicy zdefiniowanej w ten sposób:

var array=[];

Na koniec rozmiar tej tablicy wynosi 20 (COL) X3 (wiersze) i muszę przeczytać pierwszy rząd i sprawdzić istnienie niektórych wyrażeń.

68
Ameen 21 październik 2011, 14:16

7 odpowiedzi

Najlepsza odpowiedź

Musisz pętli przez każdy element w tablicy 2D i uzyskać kolumnę n .

    function getCol(matrix, col){
       var column = [];
       for(var i=0; i<matrix.length; i++){
          column.push(matrix[i][col]);
       }
       return column;
    }

    var array = [new Array(20), new Array(20), new Array(20)]; //..your 3x20 array
    getCol(array, 0); //Get first column
26
Reisepass 2 sierpień 2012, 18:43

Robienie kolumny jest łatwe dzięki Funkcja map.

// a two-dimensional array
var two_d = [[1,2,3],[4,5,6],[7,8,9]];

// take the third column
var col3 = two_d.map(function(value,index) { return value[2]; });

Dlaczego w ogóle przeszkadza w kawałku? Tylko filtr macierz, aby znaleźć interesujące rzędy.

var interesting = two_d.filter(function(value,index) {return value[1]==5;});
// interesting is now [[4,5,6]]

Niestety, Filtr i mapa nie są natywnie dostępne na IE9 i niższej. Dokumentacja MDN zapewnia implementacje przeglądarek bez natywnego wsparcia.

133
Leif Carlsen 20 październik 2012, 06:40

Użyj {x0}} z Funkcja strzałki:

const arrayColumn = (arr, n) => arr.map(x => x[n]);

const twoDimensionalArray = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9],
];

console.log(arrayColumn(twoDimensionalArray, 0));

Uwaga: Array.prototype.map() i funkcje strzałek są częścią ECMASCRIPT 6 i nie obsługują wszędzie, patrz ECMASCRIPT 6 tabeli kompatybilności.

45
Michał Perłakowski 1 grudzień 2016, 19:28

Możesz użyć następujących Metody tablicy Aby uzyskać kolumnę z tablicy 2D:

Array.prototype.map ()

const array_column = (array, column) => array.map(e => e[column]);

Array.prototype.REDUCE ()

const array_column = (array, column) => array.reduce((a, c) => {
  a.push(c[column]);
  return a;
}, []);

Array.prototype.forEach ()

const array_column = (array, column) => {
  const result = [];

  array.forEach(e => {
    result.push(e[column]);
  });

  return result;
};

Jeśli twoja tablica 2D jest kwadratem (ta sama liczba kolumn dla każdego wiersza), można użyć następującej metody:

Array.prototype.flat () / .filter ()

const array_column = (array, column) => array.flat().filter((e, i) => i % array.length === column);
11
Grant Miller 2 listopad 2018, 01:52
function arrayColumn(arr, n) {
  return arr.map(x=> x[n]);
}

var twoDimensionalArray = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
];

console.log(arrayColumn(twoDimensionalArray, 1));
5
MEHNAZ HUSSAIN 16 sierpień 2016, 18:12

Ta funkcja działa na tablice i obiekty. Obs: Działa jak funkcja Array_Column PHP. Oznacza to, że opcjonalny trzeci parametr można przekazać, aby zdefiniować, co kolumna będzie odpowiadać wskaźnikom zwrotu.

function array_column(list, column, indice){
    var result;

    if(typeof indice != "undefined"){
        result = {};

        for(key in list)
            result[list[key][indice]] = list[key][column];
    }else{
        result = [];

        for(key in list)
            result.push( list[key][column] );
    }

    return result;
}

Jest to wersja warunkowa:

function array_column_conditional(list, column, indice){
    var result;

    if(typeof indice != "undefined"){
        result = {};

        for(key in list)
            if(typeof list[key][column] !== 'undefined' && typeof list[key][indice] !== 'undefined')
                result[list[key][indice]] = list[key][column];
    }else{
        result = [];

        for(key in list)
            if(typeof list[key][column] !== 'undefined')
                result.push( list[key][column] );
    }

    return result;
}

Użyteczność:

var lista = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
];

var obj_list = [
  {a: 1, b: 2, c: 3},
  {a: 4, b: 5, c: 6},
  {a: 8, c: 9}
];

var objeto = {
  d: {a: 1, b: 3},
  e: {a: 4, b: 5, c: 6},
  f: {a: 7, b: 8, c: 9}
};

var list_obj = {
  d: [1, 2, 3],
  e: [4, 5],
  f: [7, 8, 9]
};

console.log( "column list: ", array_column(lista, 1) );
console.log( "column obj_list: ", array_column(obj_list, 'b', 'c') );
console.log( "column objeto: ", array_column(objeto, 'c') );
console.log( "column list_obj: ", array_column(list_obj, 0, 0) );

console.log( "column list conditional: ", array_column_conditional(lista, 1) );
console.log( "column obj_list conditional: ", array_column_conditional(obj_list, 'b', 'c') );
console.log( "column objeto conditional: ", array_column_conditional(objeto, 'c') );
console.log( "column list_obj conditional: ", array_column_conditional(list_obj, 0, 0) );

Wynik:

/*
column list:  Array [ 2, 5, 8 ]
column obj_list:  Object { 3: 2, 6: 5, 9: undefined }
column objeto:  Array [ undefined, 6, 9 ]
column list_obj:  Object { 1: 1, 4: 4, 7: 7 }

column list conditional:  Array [ 2, 5, 8 ]
column obj_list conditional:  Object { 3: 2, 6: 5 }
column objeto conditional:  Array [ 6, 9 ]
column list_obj conditional:  Object { 1: 1, 4: 4, 7: 7 }
*/
3
Doglas 14 lipiec 2016, 16:23

Stworzyłem bibliotekę Matrix-Slicer do manipulowania z elementami macierzy. Więc twój problem może zostać rozwiązany w ten sposób:

var m = new Matrix([
    [1, 2],
    [3, 4],
]);

m.getColumn(1); // => [2, 4]

Możliwe, że ktoś będzie przydatny dla kogoś. ;-)

3
Alexandr 27 lipiec 2018, 13:26