创建由每个子数组的最大值组成的数组不能按预期工作
Creating an array consisting of the largest values of each sub-array does not work as expected
在每个子数组中找到最大的数字,然后将这些最大的数字组成一个数组。[[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]], "");
问题是在内部循环中,当您试图找到每个数组的最大值时。在外循环的每次迭代中,您应该重置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
method
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
method你可以使用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和@Tushar的回答,这可以进一步简化为Array.map
呼叫。
我知道这里的问题是在现有的代码中找到一个bug,如果你可能想优化代码
最初的想法是@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);
这是如何工作的?
数组。Map函数遍历调用它的数组中的每个元素。这里传递给map
的函数是apply
,它的this
上下文绑定到Math.max
,第一个参数绑定到null
。
Math.max.apply.bind(Math.max, null)
这基本上调用数组上的Math.max
函数为
Math.max.apply(null, array);
更新:
使用ES6,箭头函数和扩展操作符,可以使其更小
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);
可能更简单的方法实现相同的结果-简单是可靠性的先决条件…
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。
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);
});
}
我已经通过代码和其他解决方案结束。第一个for循环遍历大数组,第二个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;
}
- jQuery dosn'内联函数不能按预期工作
- 查找数组's按属性不存在于另一个数组中的对象
- javascript don't不能按id找到每个元素
- 我需要迭代一个JSON数组——不知道如何做到——已经搜索过了,但仍然可以'我一点也不知道
- AngularStrap Select和ng选项don'使用动态数组不能很好地工作
- 按属性排序的 Javascript 对象数组不起作用
- 数组不能从变量中获取值
- 使用带有jquery/javascript的for循环创建动态数组不能访问外部或不能访问全局
- 为什么数组不在javascript中按递增日期或递减日期排序
- 创建由每个子数组的最大值组成的数组不能按预期工作
- Javascript中的多维数组:不能设置属性'0'的定义
- 如果使用if else语句,数组不能正常工作
- PHP数组不能存储变量
- 为什么我的比较数组不能工作?
- 数组不能访问元素
- 为什么图像数组不能在HTML5 Canvas中绘制
- Javascript数组不能作为数组访问
- 关联数组不能与eval() JavaScript一起工作
- 图像数组不能绘制到画布上
- JavaScript多维数组不能作为数组访问,只能作为字符串访问