Obolensk
@Obolensk

Как найти минимальное значение многомерного массива?

Всем привет.
Заранее прошу прощения за, возможно, глупый вопрос, я совсем начинающий постигать азы JavaScript.
Столкнулся с такой задачей, как найти минимальное значение в массиве массивов.
Минимальное значение обычного одномерного массива нашел с помощью Math.min.apply(null,test) и индекс его нашел конечно тоже, а вот на многомерном застрял.
Есть, например, такой массив:
[[2, 7, 2],
[2, 5, 4],
[2, 1, 5],
[3, 1, 2]];
Как найти его минимальное значение и его индекс?
  • Вопрос задан
  • 540 просмотров
Решения вопроса 4
0xD34F
@0xD34F Куратор тега JavaScript
const arr = [
  [ 2, 7, 2 ],
  [ 2, 5, 4 ],
  [ 2, 1, 5 ],
  [ 3, 1, 2 ],
];

const [ val, iRow, iCol ] = arr
  .map((n, i) => n.reduce((min, m, j) => min[0] <= m ? min : [ m, i, j ], [ Infinity, -1 ]))
  .reduce((min, n) => min[0] <= n[0] ? min : n);

UPD. Если нужно обрабатывать массивы произвольной размерности, можно применить рекурсию:

const arr = [
  [ 2, 7, 2, [ 5, [ 4, [ 3 ], 2 ] ] ],
  [ 2, 5, [ 2, 6, 5, 2 ], 4 ],
  [ 2, 1, [ [ [ 9, 0, 1 ], [ [ [ 1 ] ] ], -1 ] ], 5 ],
  [ 3, 1, 2 ],
];

const minElemWithIndex = arr =>
  arr.reduce((min, n, i) => {
    const m = n instanceof Array
      ? minElemWithIndex(n)
      : [ n, [] ];

    m[1].unshift(i);

    return m[0] < min[0] ? m : min;
  }, [ Infinity, [] ]);


const [ val, indices ] = minElemWithIndex(arr);
Ответ написан
yarkov
@yarkov Куратор тега JavaScript
Помог ответ? Отметь решением.
const test = [
	[2, 7, 2],
  [2, 5, 4],
  [2, 1, 5],
  [3, 1, 2]
]
const concat = [].concat(...test)
const min = Math.min.apply(null, concat)
const index = concat.findIndex(e => e === min)
alert(`test[${Math.floor(index / 3)}][${Math.floor(index % 3)}]`)

https://jsfiddle.net/yarkov_aleksei/00bk2sLz/
Ответ написан
Stalker_RED
@Stalker_RED
let min = [
  [2, 7, 2],
  [2, 5, 4],
  [2, 1, 5],
  [3, 1, 2]
].reduce((acc, subArray)=>Math.min(...subArray, acc), Infinity)

Пришлось использовать Infinity а не null, потому что он где-то перобразовывался в 0.

Пример: https://jsfiddle.net/2jptn5dc/

.reduce()

С поиском индекса более громоздкая штука получается https://jsfiddle.net/2jptn5dc/1/
Ответ написан
twobomb
@twobomb
var arr = [[2, 7, 2],[2, 5, 4],[2, 1, 5],[3, 1, 2]];
var min = Math.min.apply(null,arr.map((el)=>{ return Math.min.apply(null,el) }));
alert(min);//1
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы