Найдите элемент Max и Min из всех вложенных массивов в javascript

У меня есть такой массив:

var arr = [[12,45,75], [54,45,2],[23,54,75,2]];

Я хочу узнать самый большой элемент и самый маленький элемент из всех элементов вложенного массива:

Минимум должно быть: 2

а также

Максимум должно быть 75

Я пробовал следующие функции, но они не работают:

    function Max(arrs)
    {
        if (!arrs || !arrs.length) return undefined;
        let max = Math.max.apply(window, arrs[0]), m,
            f = function(v){ return !isNaN(v); };
        for (let i = 1, l = arrs.length; i<l; i++) {
            if ((m = Math.max.apply(window, arrs[i].filter(f)))>max) max=m;
        }
        return max;
    }
    function Min(arrs)
    {
        if (!arrs || !arrs.length) return undefined;
        let min = Math.min.apply(window, arrs[0]), m,
            f = function(v){ return !isNaN(v); };
        for (let i = 1, l = arrs.length; i<l; i++) {
            if ((m = Math.min.apply(window, arrs[i].filter(f)))>min) min=m;
        }
        return min;
    }

Он выдает Max как 75 и min как 12.

Любое руководство будет оценено.

Также пробовал другие ответы в SO, но никто не помогает.

Ответ на Объединить/сгладить массив массивов в JavaScript? решает проблему слияния массивов.

В то время как моя проблема состоит в том, чтобы сохранить массив как есть и выполнять операции.


person Shakti Phartiyal    schedule 07.12.2017    source источник
comment
зачем чек на номер? вы ожидаете значения NaN?   -  person Nina Scholz    schedule 07.12.2017
comment
Возможный дубликат слияния/выравнивания массива массивов в JavaScript?   -  person Andrea Carraro    schedule 07.12.2017


Ответы (7)


Предполагая ES6

const arr = [[12,45,75], [54,45,2],[23,54,75,2]];

const max = Math.max(...[].concat(...arr));

const min = Math.min(...[].concat(...arr));

console.log(max);

console.log(min);

person klugjo    schedule 07.12.2017
comment
Этот ответ является самым точным, который я ищу, спасибо за усилия. - person Shakti Phartiyal; 07.12.2017

Вы можете сначала сгладить массив (преимущество — будет работать для вложенных массивов на нескольких уровнях).

var flattenedArr = [[12,45,75], [54,45,2],[23,54,75,2] ].toString().split(",").map(Number);

Затем получите min и max из сглаженного массива.

var max = Math.max.apply( null, flattenedArr );
var min = Math.min.apply( null, flattenedArr );

Демо

var flattenedArr = [
  [12, 45, 75],
  [54, 45, 2],
  [23, 54, 75, 2]
].toString().split(",").map(Number);

var max = Math.max.apply(null, flattenedArr);
var min = Math.min.apply(null, flattenedArr);

console.log(max, min);

person gurvinder372    schedule 07.12.2017

Рекурсивный подход ES5 с проверкой типа. Он работает для глубоко вложенных массивов.

var array = [[12, 45, 75], [54, 45, 2], [23, 54, 75, 2]],
    min = array.reduce(function min(a, b) {
        return Math.min(Array.isArray(a) ? a.reduce(min) : a, Array.isArray(b) ? b.reduce(min) : b);
    }),
    max = array.reduce(function max(a, b) {
        return Math.max(Array.isArray(a) ? a.reduce(max) : a, Array.isArray(b) ? b.reduce(max) : b);
    });
    
console.log(min, max);

С функциями для использования в качестве обратного вызова.

function flat(f, v) { return Array.isArray(v) ? v.reduce(f) : v; }
function getMin(a, b) { return Math.min(flat(getMin, a), flat(getMin, b)); }
function getMax(a, b) { return Math.max(flat(getMax, a), flat(getMax, b)); }

var array = [[12, 45, 75], [54, 45, 2], [23, 54, 75, 2]],
    min = array.reduce(getMin),
    max = array.reduce(getMax);
    
console.log(min, max);

person Nina Scholz    schedule 07.12.2017

Вы можете просто объединить весь вложенный массив в один массив, а затем найти минимальное и максимальное значение, используя Math.min.apply(null, array) и Math.max.apply(null, array)

var arr = [[12,45,75], [54,45,2],[23,54,75,2]];
var merged = [].concat.apply([], arr);
var max = Math.max.apply(null, merged);
var min = Math.min.apply(null, merged);
console.log(max,min)

person Bhuwan    schedule 07.12.2017

Решение без конкатенации, которое работает для любого уровня вложенности

let arr = [[12,45,75], [54,45,2],[23,54,75,2]];

function findMaxFromNestedArray(arr) {
  let max = Number.MIN_SAFE_INTEGER;
  
  for (let item of arr) {
    if(Array.isArray(item)) {
      let maxInChildArray = findMaxFromNestedArray(item);
      if (maxInChildArray > max) {
        max = maxInChildArray;
      }
    } else {
      if (item > max) {
        max = item;
      }
    }
  }
  
  return max;
}

console.log(findMaxFromNestedArray(arr))

person shawon191    schedule 07.12.2017

Решение только с одним сокращением:

const getMaxMin = (flattened) => {
return flattened.reduce(
        (a, b) => {            
            return {
                maxVal: Math.max(b, a.maxVal),
                minVal: Math.min(b, a.minVal),                
            };
        },
        {
            maxVal: -Infinity,
            minVal: Infinity,            
        }
    );
}
const flatSingle = arr => [].concat(...arr)
const maxMin = getMaxMin(flatSingle(arr))
console.log(maxMin);
person Kkkk Kkkk    schedule 05.09.2019

Мы можем сгладить массив с помощью Array.prototype.flat. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat

const nestedArray = [[12,45,75], [54,45,2],[23,54,75,2]]
const flattenedArray = nestedArray.flat(2)

const minValue = Math.min.apply(null, flattenedArray)
const maxValue = Math.max.apply(null, flattenedArray)

console.log( {flattenedArray, minValue, maxValue} )

person madav    schedule 06.01.2020