我有这个包含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,如果这可能是一个快捷方式......
答案 0 :(得分:1)
您正在获得这些结果,因为您正在比较字符串,而不是数字。
console.log("15" > "8"); // false
console.log(15 > 8); // true
&#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;
(我交换了评估数组的顺序,因此您不必预先初始化输出,但除了Number()
转换之外,这与您的代码类似。)
答案 1 :(得分:1)
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));
});