JavaScript数组:检查最大元素

时间:2018-01-22 08:04:21

标签: javascript

好的,所以我看不出我做错了什么。 我的任务是编写一个函数,它返回列表中最大的元素,我有5个场景。 (检查茉莉花)

我在Jasmine中这样做,所以它抛出并期望某些结果,如下:

describe('List', function() {
  'use strict';

  var list;

  beforeEach(function() {
    list = new List();
  });

  it('should find the largest element', function() {
    var data = [1, 100, 32, 453, 21, 5, 23, 12, 90];
    expect(list.findLargest(data)).toBe(453);
  });

  it('should cover negative values', function() {
    var data = [-1, -123, -2, -6, -10000, -10];
    expect(list.findLargest(data)).toBe(-1);
  });

  it('should cover duplicated values', function() {
    var data = [-1, -123, -1, -6, -10000, -1];
    expect(list.findLargest(data)).toBe(-1);
  });

  it('should cover all duplicated values', function() {
    var data = [3, 3, 3, 3, 3, 3, 3, 3, 3];
    expect(list.findLargest(data)).toBe(3);
  });

  it('should cover empty list', function() {
    expect(function() {
      list.findLargest([]); 
    }).toThrow('List cannot be empty.');
  });

});

这是我得到的:

var List = function() {
  'use strict';

  function findLargest(list) {
    var largest = [];

    console.log(list);
    if( list[i] > 0){
      for (var i = 0; i < list.length; i++) {
        if (largest < list[i] ) {
            largest = list[i];
        }
    }
    console.log(largest);
    return 453;
    //return largest; //Doesn't work
    }

    else if( list[i] < 0 ){
      console.log("negative");
      for (var i = 0; i < list.length; i++) {
        if (largest > list[i] ) {
            largest = list[i];
        }
      }
      console.log(largest);
      return largest;
    }

    // else {
    //    throw("List cannot be empty.");
    // }

  }

  return {
    findLargest: findLargest
  };
};

我测试时未定义:https://imgur.com/a/rc2mx

我看不出它是如何从数组中的元素到未定义的。

理论上我的第一个函数检查数组是否有正数或负数,然后它会看到哪个是最大的。 我甚至尝试返回预期值(453),但它仍然未定义给我。

else函数用于数组为空的最终场景。

4 个答案:

答案 0 :(得分:0)

您在i循环中将变量0设置为for,这是if语句内部,因此list[i] > 0检查会抛出错误,因为那时iundefined

答案 1 :(得分:0)

您可以使用检查数组的长度,如果数组中没有项目,则可以提前返回。

对于另一个检查,将第一个元素作为临时最大值,并检查索引1中的所有其他元素。

无需区分负数和正数。

function findLargest(list) {
    var largest = list[0],
        i;

    if (!list.length) {
        return; // no items
    }
    
    for (i = 1; i < list.length; i++) {
        if (largest < list[i]) {
            largest = list[i];
        }
    }
    return largest;
}

console.log(findLargest([]));
console.log(findLargest([-1, -2, -4, -1]));
console.log(findLargest([2, 5, 3, 7, 2]));
console.log(findLargest([-8, 2, 5, 3, 7, 2]));

答案 2 :(得分:0)

使用Array#reduce,该函数可写为:

Array.prototype.findLargest = function() {
  if (this.length === 0) {
    throw("List cannot be empty.")
  }
  return this.reduce(function(a, b) {
    return a > b ? a : b
  })
}
var data = [-1, -123, -1, -6, -10000, -1]
var largest = data.findLargest()
console.log(largest)

var data = []
try {
  var largest = data.findLargest()
} catch (e) {
  console.log(e)
}

或更简单......

var data = [-1, -123, -1, -6, -10000, -1]
var largest = data.reduce(function(a, b) {return a > b ? a : b})
console.log(largest)

答案 3 :(得分:0)

除非我遗漏了一些要求,否则你也可以使用Math.max

function findLargest(list) {
  if(list.length)
    return Math.max(...list);
  throw("List cannot be empty.");
}

//test code:
for(let data of [
	[1, 100, 32, 453, 21, 5, 23, 12, 90],
  [-1, -123, -2, -6, -10000, -10],
  [-1, -123, -1, -6, -10000, -1],
  []
])
	console.log('largest in ', JSON.stringify(data), ':', findLargest(data));