从二维数组中获取列

Ame*_*een 54 javascript

如何从二维数组而不是单个条目中检索列?我这样做是因为我只想在其中一个列中搜索一个字符串,所以如果有另一种方法可以实现这一点,请告诉我.

我正在使用这种方式定义的数组:

var array=[];
Run Code Online (Sandbox Code Playgroud)

最后,这个数组的大小是20(col)x3(行),我需要读取第一行并检查其中是否存在某些短语.

Lei*_*sen 110

使用地图功能可以轻松获取列.

// 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]; });
Run Code Online (Sandbox Code Playgroud)

为什么要烦恼呢?只需过滤矩阵即可找到感兴趣的行.

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

遗憾的是,过滤器和地图在IE9及更低版本上不是原生的.MDN文档为没有本机支持的浏览器提供了实现.


Mic*_*ski 31

使用Array.prototype.map()箭头的功能:

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));
Run Code Online (Sandbox Code Playgroud)

注意:Array.prototype.map()箭头函数是ECMAScript 6的一部分,并且在任何地方都不受支持,请参阅ECMAScript 6兼容性表.

  • 仅仅是我,还是这在js中不必要地复杂了?无论如何,这很有用,谢谢@Michal。 (2认同)

Rob*_*b W 22

你必须循环遍历2d数组中的每个元素,并获得第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
Run Code Online (Sandbox Code Playgroud)

  • 我知道我可以这样做,但我认为有一个预定义的函数或方法来检索这些数据.无论如何,谢谢你的回答. (6认同)

Gra*_*ler 13

您可以使用以下数组方法从二维数组中获取列:

Array.prototype.map()

const array_column = (array, column) => array.map(e => e[column]);
Run Code Online (Sandbox Code Playgroud)

Array.prototype.reduce()

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

Array.prototype.forEach()

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

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

  return result;
};
Run Code Online (Sandbox Code Playgroud)

如果您的二维数组是正方形(每行的列数相同),则可以使用以下方法:

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

const array_column = (array, column) => array.flat().filter((e, i) => i % array.length === column);
Run Code Online (Sandbox Code Playgroud)


Yur*_*ich 10

var data = [
    ["a1", "a2", "a3"],
    ["b1", "b2", "b3"],
    ["c1", "c2", "c3"]
];

var col0 = data.map(d => d[0]); // [ 'a1', 'b1', 'c1' ]

var col1 = data.map(d => d[1]); // [ 'a2', 'b2', 'c2' ]
Run Code Online (Sandbox Code Playgroud)


小智 10

JavaScript 中的 ES6 版本:

使用对象键:

var haystack = [
 {a:1, b:2},
 {a:3, b:4},
 {a:5, b:6}
];

var b_col = haystack.map(x => x.b); // [2,4,6]
Run Code Online (Sandbox Code Playgroud)

使用嵌套数组索引:

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

var col_2 = haystack.map(x => x[2]); // [3,3,7,7]
Run Code Online (Sandbox Code Playgroud)

@Pylon的答案也是将其添加到数组原型的好方法。


小智 5

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));
Run Code Online (Sandbox Code Playgroud)