确定哪个数组是更长的JavaScript

时间:2014-07-10 21:20:24

标签: javascript arrays function max min

抱歉我要改变我搞砸的问题。目的是使用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作为参数。

7 个答案:

答案 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。

我希望这可以做你想要的!

编辑:为数组添加名称属性,以便在函数结束时返回名称。