好的,所以我看不出我做错了什么。 我的任务是编写一个函数,它返回列表中最大的元素,我有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函数用于数组为空的最终场景。
答案 0 :(得分:0)
您在i
循环中将变量0
设置为for
,这是if语句内部,因此list[i] > 0
检查会抛出错误,因为那时i
是undefined
。
答案 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));