2017-09-27 1 views
-1

Ich habe dieses Array mit 4 Reihen von Elementen 18 (** zur Folge bezieht, die nicht Teil der Code-/Array):Get höchsten und niedrigsten in jedem Element aus mehreren Arrays in JavaScript

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

Ich brauche Holen Sie sich zwei neue Arrays mit dem höchsten der 18 Elemente und einem mit dem niedrigsten. Ich habe dies gemacht:

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

Aber das Ergebnis ich dieses erhalten ist, auf dem zweiten Hoch Element es 8 zurück, aber das sollte 15 (siehe **) sein:

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

Ich kippe herauszufinden, wie dies zu bewerkstelligen ...

Underscore.js ist markiert, wenn das eine Verknüpfung sein könnte ...

+0

Es ist nicht mir sieht klar. Sie haben ein Array Array namens "highlow" und Sie möchten es in zwei Arrays verarbeiten. Einer mit den 18 unteren Elementen von "highlow" mit dem Namen "low" und einer mit den 18 höheren "high" genannten Rechten? Von dem, was ich sehe, ist es nicht nur das Problem. Können Sie ein Beispiel mit den erwarteten Ergebnissen drucken? – Sylhare

+0

Also glaubst du, dass "24" höher ist als "8"? – Keith

+0

Ok ja es war ein Beispiel (leider nicht ganz klar), um das erste falsche Element zu zeigen, aber ja, das sind viele Fehler;) –

Antwort

1

Sie diese Ergebnisse bekommen, weil Sie Strings sind zu vergleichen, keine Zahlen.

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

zu Zahlen konvertieren, wenn der Vergleich die richtigen Ergebnisse liefern zu tun:

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

(tauschte ich die Reihenfolge, in der die Arrays ausgewertet werden, so dass Sie wouldn‘ t muss die Ausgabe vorinitialisieren, aber ansonsten ist dies ähnlich wie bei Ihrem Code mit Ausnahme der Number() Konvertierungen.)

+0

Ahh ich sehe, fügte parseInt() hinzu :) Aber das Ergebnis auf dem niedrigen Array hat 0 nicht das niedrigste positive Nummer. –

+0

@MartinLyder Whoops! Dummer Fehler meinerseits, jetzt korrigiert. –

+0

Ja !! Es funktioniert, danke !! Ich akzeptiere diese Antwort :) Es ist diejenige, die meinem eigenen Code am nächsten kommt ... –

0

Sie können alle Werte in ein einzelnes Array ablegen, die Werte sortieren und das Array dann halbieren, um Arrays mit hohem und niedrigem Wert zu erstellen.

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

Sie könnten die Min- und Max-Werte reduzieren.

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

1

Verwenden Math.min() und 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))); 
} 
0

Hoffe, dass es helfen:

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