找出每个子数组中的最大数字,然后创建一个包含这些最大数字的数组。[[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]
我写了一些代码,但我无法弄清楚它有什么问题。也许Array.push()方法不起作用或者也许for循环。
function largestOfFour(arr) {
var main = [];
for(k=0;k<arr.length;k++){
var long= 0;
for(i=0;i<arr[k].length;i++){
if(arr[k][i]<long) {
arr[k][i] = long;
}
main.push[long];
}
}
return main
}
largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]], "");
答案 0 :(得分:14)
当您尝试查找每个数组的最大值时,问题出在内部循环上。在外循环的每次迭代中,您应该重置long = arr[k][0]
。它不应该重置为0,因为最大值可能小于0.请注意,这要求所有子数组至少有一个项目。
如@ edc65所述,long
的声明应该在函数的开头发生,以明确long
,因为所有局部变量都有函数作用域。
每个子阵列只需要一个值。因此,您应该为外部循环的每次迭代添加一个值(main.push
应该在外部循环中)。目前的方式是,每个子数组元素添加一个值。
在if语句中,您的作业被颠倒了。它应该是
long = arr[k][i];
条件也是倒置的。 long
存储每个子数组的最大值。因此,如果您发现值更高,则更新它:
if(arr[k][i]>long) {
long = arr[k][i];
}
当推入数组时,使用括号,而不是括号:
main.push(long);
括号用于调用方法。括号用于访问对象中的属性。
function largestOfFour(arr) {
var main = [];
var long;
for(k=0;k<arr.length;k++){
long = arr[k][0];
for(i=0;i<arr[k].length;i++){
if(arr[k][i]>long) {
long = arr[k][i];
}
}
main.push(long);
}
return main;
}
Math.max
方法您可以使用Math.max
来简化代码
function largestOfFour(arr) {
var main = [];
for(k=0;k<arr.length;k++){
var long = Math.max.apply(null, arr[k]);
main.push(long);
}
return main;
}
根据@BillyMoon's和@Tushar's个答案,可以进一步简化为Array.map
来电。
答案 1 :(得分:6)
我知道这里的问题是在现有代码中找到一个错误,以防您想要优化代码
原始idea属于@thefourtheye。我在这里解释一下。
不需要嵌套循环,您可以在单行中实现此目的。
var arr = [[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]];
var result = arr.map(Math.max.apply.bind(Math.max, null));
document.write(result);
console.log(result);
这是如何运作的?
array.map函数正在迭代调用它的数组中的每个元素。
传递给map
的函数是apply
,其this
上下文绑定到Math.max
,第一个参数绑定到null
。
Math.max.apply.bind(Math.max, null)
这基本上将数组上的Math.max
函数称为
Math.max.apply(null, array);
<强>更新强>
使用ES6,arrow function和spread operator,可以做得更小
arr.map(e => Math.max(...e))
var arr = [[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]];
var result = arr.map(e => Math.max(...e));
document.write(result);
console.log(result);
答案 2 :(得分:3)
实现相同结果的潜在简单方法 - 简单性是可靠性的先决条件......
function largestOfFour(arr){
// assumes compatible browser, or shim: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/map#Browser_compatibility
// map array each element into new value based on callback's return
return arr.map(function(subarr){
// sort to get highest value at front, and then return it
return subarr.sort(function(a,b){
return b-a;
})[0];
});
}
或使用Math.max(请参阅注释...)
function largestOfFour(arr){
// assumes compatible browser, or shim: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/map#Browser_compatibility
// map array each element into new value based on callback's return
return arr.map(function(subarr){
// sort to get highest value at front, and then return it
return Math.max.apply(null, subarr);
});
}
答案 3 :(得分:0)
我已经通过代码并以其他解决方案结束。第一个for循环遍历大数组,第二个循环遍历子数组的组件。
function largestOfFour(arr) {
var main = [];
for(k=0;k<arr.length;k++){
var long=0;
for(i=0;i<arr[k].length;i++){
if(long<arr[k][i]) {
long=arr[k][i];
}
}
main.push(long);
}
return main;
}