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

时间:2017-09-27 20:25:40

标签: javascript arrays underscore.js

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

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"]

我无法弄清楚如何管理这个......

标记了Underscore.js,如果这可能是一个快捷方式......

5 个答案:

答案 0 :(得分:1)

您正在获得这些结果,因为您正在比较字符串,而不是数字。

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

进行比较时转换为数字会得到正确的结果:

&#13;
&#13;
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);
&#13;
&#13;
&#13;

(我交换了评估数组的顺序,因此您不必预先初始化输出,但除了Number()转换之外,这与您的代码类似。)

答案 1 :(得分:1)

使用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)));
}

答案 2 :(得分:0)

您可以将所有值放入单个数组中,对值进行排序,然后将数组切成两半以创建高值和低值数组。

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;

答案 3 :(得分:0)

您可以减少最小值和最大值。

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

答案 4 :(得分:0)

希望有所帮助:

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