Получить столбец из двумерного массива
Как я могу получить столбец из 2-мерного массива, а не одной записи? Я делаю это потому, что хочу найти строку только в одном из столбцов, поэтому, если есть другой способ сделать это, пожалуйста, сообщите мне.
Я использую массив, определенный таким образом:
var array=[];
В конце размер этого массива составляет 20 (столбец) x3 (строки), и мне нужно прочитать первую строку и проверить наличие в ней какой-либо фразы.
Ответы
Ответ 1
Вам нужно пройти через каждый элемент в 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
Ответ 2
С помощью функции сопоставить столбцы легко.
// 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]; });
Зачем вообще беспокоиться об этом? Просто filter матрицу, чтобы найти интересующие строки.
var interesting = two_d.filter(function(value,index) {return value[1]==5;});
// interesting is now [[4,5,6]]
К сожалению, фильтр и карта не доступны на IE9 и ниже. Документация MDN обеспечивает реализацию для браузеров без встроенной поддержки.
Ответ 3
Используйте Array.prototype.map()
с помощью функции arrow:
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));
Ответ 4
Эта функция работает с массивами и объектами.
obs: он работает как функция array_column php. Это означает, что необязательный третий параметр может быть передан для определения того, какой столбец будет соответствовать индексам возврата.
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;
}
Это условная версия:
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;
}
удобство и простота использования:
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) );
Вывод:
/*
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 }
*/
Ответ 5
Я создал библиотечный матричный слайсер для работы с матричными элементами. Таким образом, ваша проблема может быть решена так:
var m = new Matrix([
[1, 2],
[3, 4],
]);
m.getColumn(1); // => [2, 4]
Возможно это кому-нибудь пригодится. ;-)
Ответ 6
Вы можете использовать следующие методы массива для получения столбца из 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;
};
Если ваш 2D-массив представляет собой квадрат (такое же количество столбцов для каждой строки), вы можете использовать следующий метод:
Array.prototype.flat()/.filter()
const array_column = (array, column) => array.flat().filter((e, i) => i % array.length === column);
Ответ 7
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));
Ответ 8
Массивы действительно не имеют четко определенных строк и столбцов, но по существу вы можете получить доступ только к элементу в массиве, что означает, что вы можете получить любой из массивов, содержащихся во внешнем массиве, или элемент в одном из этих массивов, Нет причин, по которым вы не можете просто создать новый массив и прочитать все значения в, но если вы просто ищете значение, которое вы также можете сделать, переходя через:
var column = 2;
for (var i = 0; i < array.length; i++) {
if (matchesSearch(array[i][column])) {
// Do what you want with a matched result, perhaps store it in a result array.
}
}
Очевидно, вам нужно реализовать matchesSearch
, чтобы он возвращал значение true, если значение соответствует тому, что вы ищете.