抱歉我要改变我搞砸的问题。目的是使用Math.max函数来确定最长的数组。我需要添加一个额外的参数来使其实用,因为每个人都在使用>而不是Math.max。我写的这个例子很快,并没有想到这一点。
有更简单的方法吗?目的是能够采用许多参数(超过两个)并找出哪个具有更大的长度。我希望它是动态的,所以我似乎需要在传递它们之前为每个数组赋予一个name属性。这是找到数组名称的唯一方法吗?
var arrayLogA = [8, 7, 5, 4, 6, 8, 0, 9, 4];
arrayLogA.name = 'arrayLogA';
var arrayLogB = [1, 5, 4, 6, 5, 9, 3, 2, 7, 3, 2]
arrayLogB.name = 'arrayLogB';
var arrayLogC = [1, 6, 9, 3, 3, 7, 3, 2]
arrayLogC.name = 'arrayLogC';
function returnLargestArray(a, b, C) {
...
}
returnLargestArray(arrayLogA, arrayLogB);
好吧,这更实际,如果我要解释Math.max函数并返回最大的函数,我将不得不重新考虑该函数。对不起任何困惑。我通常会写好问题,但我想我是冲了这个问题。很抱歉。
我可能需要传递其他参数。所以我可能不应该使用a,b,c作为参数。
答案 0 :(得分:2)
function returnLargestArray(a,b){
if(!a || typeof a.length =="undefined" ||
!b || typeof b.length =="undefined") {return;}
if(a.length==b.length){/*return some value of your choosing*/}
return a.length>b.length?a:b;
}
returnLargestArray([1,2,3],[1,2,3,4]);
但要注意非“简单”数组的注意事项。
答案 1 :(得分:1)
试试这个。 (我还没有对它进行测试,但这很有意义!)
function returnLargestArray(a, b) {
if (a.length > b.length) {
return console.log("winner: "+ a.name);
} else {
return console.log("winner: "+ b.name);
}
}
如果他们的长度相同而失败,那么你就明白了。
答案 2 :(得分:1)
如下:
if (a.length > b.length) {
console.log("winner: "+ a.name);
return a;
else {
console.log("winner: "+ b.name);
return b;
}
或者如果你想要它真的很短:
return a.length > b.length ? a : b;
作为旁注,你的逻辑可以使用一点点工作。现在它返回console.log
的输出,即undefined
。返回数组更有意义,并且从函数名称更有意义。
答案 3 :(得分:1)
function returnLargestArray(a, b) {
return 'winner is ' + (a.length == b.length ? 'nobody' : (a.length > b.length ? a : b).name);
}
答案 4 :(得分:1)
您可以在代码中使用不同的结构。看起来您需要具有两个属性的对象:名称和数据数组。
var logA = {
name: "logA",
array: [8, 7, 5, 4, 6, 8, 0, 9, 4]
};
var logB = {
name: "logB",
array: [1, 5, 4, 6, 5, 9, 3, 2, 7, 3, 2]
};
然后定义一个对这些对象进行操作的函数:
function largestLog( a, b ) {
if ( a.array.length > b.array.length ) {
return a;
}
else {
return b;
}
}
然后你可以调用该函数,获取具有最大数组的对象,并将其名称打印到控制台:
var l = largestLog( logA, logB );
console.log( l.name );
答案 5 :(得分:1)
在正常情况下,您可能会检查数组的长度,然后返回满足逻辑(更大或更小)的数组,然后使用该对象。
将a和b重新分配给arrayA和arrayB似乎没有任何价值,除此之外还要提供语义答案。您也可以将这些var赋值用作字符串,因为它会在您演示的上下文中更有意义。
var arrayLogA = [8, 7, 5, 4, 6, 8, 0, 9, 4];
var arrayLogB = [1, 5, 4, 6, 5, 9, 3, 2, 7, 3, 2]
function returnLargestArray(a, b) {
var a = a.length,
b = b.length,
winner = 'arrayA';
if(a < b && a !== b) {
winner = 'arrayB';
} else {
winner = 'none';
}
return winner;
}
returnLargestArray(arrayLogA, arrayLogB);
Math.max()
可能是对需求的过剩,我不认为它比普通运算符[=!<>]
具有任何速度优势,因为您正在使用另一个对象来播放Math
并访问该对象的功能。
我被教导的方式是(在这个二进制场景[true,false] [a或b]等)是在函数顶部设置一个返回值。这样,每个阅读的人都可以很容易地看到功能的用途,然后使用你的逻辑来切换状态。
所以如果胜利者= a;你测试的是b大于a,如果是,则设置winner = b。保存了大量代码,应该更有效率。
答案 6 :(得分:1)
好吧,这可能不太理想,当然感觉有点奇怪,但你可以这样做。
var arrayLogA = [8, 7, 5, 4, 6, 8, 0, 9, 4];
arrayLogA.name = 'arrayLogA';
var arrayLogB = [1, 5, 4, 6, 5, 9, 3, 2, 7, 3, 2];
arrayLogB.name = 'arrayLogB';
var arrayLogC = [1, 6, 9, 3, 3, 7, 3, 2];
arrayLogC.name = 'arrayLogC';
...
var arrayLogN = [ ... ];
arrayLogN.name = 'arrayLogN';
function returnLargestArray(/* some unknown number of arrays */) {
var lengths = [];
// store lengths of each array
for(var i = 0; i < arguments.length; i++){
lengths.push(arguments[i].length);
}
// use Math.max to get biggest length
var largest = Math.max.apply(null, lengths);
// use indexOf to get the index of biggest length
var indexOfLargest = lengths.indexOf(largest);
// use the indexOfLargest to return that value from arguments
return arguments[indexOfLargest].name;
}
returnLargestArray(arrayLogA, arrayLogB, arrayLogC, ..., arrayLogN);
使用此方法将返回传递给函数的最长数组,而无需为每个数组命名。
快速说明:此函数调用Math.max.apply而不仅仅是Math.max,因为Math.max需要大量输入,而不仅仅是我们试图在其中找到最大值的一个数组。要使Math.max适用于数组,我们必须使用Math.max.apply。
我希望这可以做你想要的!
编辑:为数组添加名称属性,以便在函数结束时返回名称。