【问题标题】:Find the Max and Min element out of all the nested arrays in javascript从javascript中的所有嵌套数组中找到Max和Min元素
【发布时间】:2018-05-21 08:44:32
【问题描述】:

我有一个这样的数组:

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;
    }

它给出的最大值为 75,最小值为 12。

任何指导将不胜感激。

还在 SO 中尝试了其他答案,但没有任何帮助。

Merge/flatten an array of arrays in JavaScript?的答案解决了合并数组的问题。

而我的问题是保持数组不变并执行操作。

【问题讨论】:

标签: javascript arrays max min


【解决方案1】:

假设 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);

【讨论】:

  • 这个答案是我要找的最准确的答案,谢谢你的努力。
【解决方案2】:

您可以先展平数组(优势 - 适用于多个级别的嵌套数组

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

然后从扁平化数组中获取minmax

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);

【讨论】:

    【解决方案3】:

    通过检查类型的 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);

    【讨论】:

      【解决方案4】:

      您可以简单地将所有嵌套数组合并为一个数组,然后使用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)

      【讨论】:

        【解决方案5】:

        没有连接的解决方案,适用于任何级别的嵌套

        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))

        【讨论】:

          【解决方案6】:

          只有一个 reduce 的解决方案:

          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);
          

          【讨论】:

            【解决方案7】:

            我们可以使用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} )

            【讨论】:

              【解决方案8】:

              另一种解决方案

              var arry=[[12,45,75], [54,45,2],[23,54,75,2]];
              console.log("MAX",Math.max(...arry.join().split(',').map(e=>+e)));
              console.log("MIN",Math.min(...arry.join().split(',').map(e=>+e)));

              【讨论】:

                【解决方案9】:

                const getFlatArr = (arr) => arr.join().split(',').map(Number)
                
                const getMax = (arr) => {
                  const newArr = getFlatArr(arr)
                  let max = newArr[0]
                  newArr.forEach((value) => {
                    max = value > max ? value : max
                  })
                  return max
                }
                
                const getMin = (arr) => {
                  const newArr = getFlatArr(arr)
                  let min = newArr[0]
                  newArr.forEach((value) => {
                    min = value < min ? value : min
                  })
                  return min
                }
                
                const arr1 = [
                  [12, 45, 75],
                  [54, 45, 2],
                  [23, 54, 75, 2],
                ]
                console.log(`Max: ${getMax(arr1)}`)
                console.log(`Min: ${getMin(arr1)}`)
                
                const arr2 = [1, 2, [14, 56, 34, [48, 98]], [14, 16, 11, [18, 81]], 34, 35]
                console.log(`Max: ${getMax(arr2)}`)
                console.log(`Min: ${getMin(arr2)}`)

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2017-06-30
                  • 2022-07-04
                  • 2014-05-26
                  • 2020-12-04
                  • 2020-08-25
                  • 2021-10-14
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多