代码之家  ›  专栏  ›  技术社区  ›  Martin Lyder

在javascript中从多个数组中获取每个元素的最高值和最低值

  •  -1
  • Martin Lyder  · 技术社区  · 7 年前

    我有一个包含18个元素的4个数组的数组(**表示结果,而不是代码/数组的一部分):

    highlow: [["-5", "8", "-8", "13", "17", "11", "17", "4", "17", "18", "18", "10", "-8", "-13", "-22", "-16", "-3", "27"],
    ["5", "**15**", "6", "-11", "-18", "-7", "-6", "7", "-10", "5", "6", "-6", "-12", "-10", "-7", "14", "10", "23"],
    ["-6", "7", "8", "18", "6", "14", "24", "14", "6", "13", "8", "18", "-14", "-15", "-9", "-13", "14", "12"],
    ["-19", "-12", "14", "20", "15", "20", "11", "19", "13", "5", "2", "-14", "5", "6", "16", "-5", "8", "30"]]
    

    我需要得到两个新的数组,其中18个元素中最高的一个,最低的一个。

    var highlow = [];
    var high = [];
    var low = [];
    
    for (i = 0; i < 18; i++) { 
            high.push("0");
            low.push("0");
    }                   
    
     for (var l = 0; l < highlow.length; l++) {
    
                       for (var m = 0; m < highlow[0].length; m++) {
                          // High   
                              if (highlow[l][m] > high[m]) {
                                  high.splice(m, 1, highlow[l][m]);
                              }    
                          // Low
                              if (highlow[l][m] < low[m]) {
                                  low.splice(m, 1, highlow[l][m]);  
                              } 
                         }
                       }
    

    但我得到的结果是,在第二个高元素上返回8,但应该是15(参见**):

    high:
     ["5","**8**","8","20","6","20","24","7","6","5","8","18","5","6","16","14","8","30"]
    low:
     ["-19","-12","14","-11","15","-7","11","19","13","5","2","-14","-14","-15","-9","-5","-3","12"]
    

    我不知道该怎么办。。。

    5 回复  |  直到 7 年前
        1
  •  1
  •   Daniel Beck    7 年前

    你得到这些结果是因为你在比较字符串,而不是数字。

    console.log("15" > "8"); // false
    console.log(15 > 8); // true

    进行比较时将其转换为数字,得出正确的结果:

    var input =  [
        ["-5",  "8",   "-8", "13",  "17",  "11", "17", "4",  "17",  "18", "18", "10",  "-8",  "-13", "-22", "-16", "-3", "27"],
        ["5",   "15",  "6",  "-11", "-18", "-7", "-6", "7",  "-10", "5",  "6",  "-6",  "-12", "-10", "-7",  "14",  "10", "23"],
        ["-6",  "7",   "8",  "18",  "6",   "14", "24", "14", "6",   "13", "8",  "18",  "-14", "-15", "-9",  "-13", "14", "12"],
        ["-19", "-12", "14", "20",  "15",  "20", "11", "19", "13",  "5",  "2",  "-14", "5",   "6",   "16",  "-5",  "8",  "30"]
    ];
    
    var high = [];
    var low = [];
    for (var i=0; i<input[0].length; i++) {
        for (var j = 0; j<input.length; j++) {
           if (!high[i] || Number(input[j][i]) > Number(high[i])) { high[i] = input[j][i];}
           if (!low[i]  || Number(input[j][i]) < Number(low[i]))  { low[i]  = input[j][i];}
        }
    }
    
    console.log("high:", high);
    console.log("low:", low);

    Number() 转换。)

        2
  •  1
  •   Ammar    7 年前

    Math.min() Math.max()

    var high = [], low = [];
    for (i = 0; i < highlow[0].length; i++) {
      var col = highlow.map(val => val[i]);
      high.push(col.reduce((a,b)=>Math.max(a,b)));
      low.push(col.reduce((a,b)=>Math.min(a,b)));
    }
    
        3
  •  0
  •   Doug    7 年前

    您可以将所有值放入一个单数数组中,对值进行排序,然后将数组一分为二,以创建高值和低值数组。

    let superArray = [];
    superArray.push( highlow[0] );
    superArray.push( highlow[1] );
    superArray.push( highlow[2] );
    superArray.push( highlow[3] );
    
    superArray.sort();
    
    let lowArray = superArray.splice(0, superArray.length -1);
    let highArray = superArray;
    
        4
  •  0
  •   Nina Scholz    7 年前

    function highlow(array) {
        return array.reduce(function (r, a, i) {
            if (!i) {
                r.low = a.slice();
                r.high = a.slice();
                return r;
            }
            a.forEach(function (b, j) {
                r.low[j] = Math.min(r.low[j], b);
                r.high[j] = Math.max(r.high[j], b);
            })
            return r;
        }, { low: [], high: [] });
    }
    
    console.log(highlow([["-5", "8", "-8", "13", "17", "11", "17", "4", "17", "18", "18", "10", "-8", "-13", "-22", "-16", "-3", "27"], ["5", "15", "6", "-11", "-18", "-7", "-6", "7", "-10", "5", "6", "-6", "-12", "-10", "-7", "14", "10", "23"], ["-6", "7", "8", "18", "6", "14", "24", "14", "6", "13", "8", "18", "-14", "-15", "-9", "-13", "14", "12"], ["-19", "-12", "14", "20", "15", "20", "11", "19", "13", "5", "2", "-14", "5", "6", "16", "-5", "8", "30"]]));
        5
  •  0
  •   Hassan    7 年前

    希望有帮助:

    var highlow =[["-5", "8", "-8", "13", "17", "11", "17", "4", "17", 
        "18", "18", "10", "-8", "-13", "-22", "-16", "-3", "27"],
        ["5", "15", "6", "-11", "-18", "-7", "-6", "7", "-10", "5", "6", 
        "-6", 
        "-12", "-10", "-7", "14", "10", "23"],
        ["-6", "7", "8", "18", "6", "14", "24", "14", "6", "13", "8", 
        "18", 
        "-14", "-15", "-9", "-13", "14", "12"],
        ["-19", "-12", "14", "20", "15", "20", "11", "19", "13", "5", "2", 
        "-14", "5", "6", "16", "-5", "8", "30"]]
    
    var high=[];
    var low=[];
    highlow.map((a)=>{
        hight.push(Math.max(...a));
        low.push(Math.min(...a));
    });