Javascript:找不到嵌套在对象中的数组的最大值

时间:2019-02-06 23:15:59

标签: javascript

我希望这段代码返回4作为obj.key上数组的最大值,但是下面的代码却返回1

有人可以帮助解决此问题,并以较短的方式实现吗?

var obj = {
  key: [1, 2, 4]
}
function getLargestElementAtProperty(obj, key) {
   if (!Array.isArray(obj[key])) {
      return undefined
   }
   for (num in obj[key]) {
      return Math.max(obj[key][num])
   }
}

var output = getLargestElementAtProperty(obj, 'key');
console.log(output); // --> expected 4

3 个答案:

答案 0 :(得分:2)

问题是一个函数只能返回一次。因此,当您第一次遍历数组并获得一个数组时,它将返回并且函数已完成运行。 Math.max()返回0或多个数字中的最大值,因此,如果仅传递一个数字,它将始终返回该数字。像下面这样的东西会起作用。

const obj = {
  key: [1, 2, 4]
}
function getLargestElementAtProperty(obj, key) {
  let largest;
   if (!Array.isArray(obj[key])) {
      return undefined
   }
   for (num in obj[key]) {
      if (!largest || largest < obj[key][num]) {
        largest = obj[key][num];
      }
   }
   return largest;
}

var output = getLargestElementAtProperty(obj, 'key');
console.log(output); // --> expected 4

此外,如果您可以使用Math.max和散布运算符以更现代的JavaScript方式实现相同的目的,则如下所示:

const obj = {
  key: [1, 2, 4]
}
function getLargestElementAtProperty(obj, key) {
   if (!Array.isArray(obj[key])) {
      return undefined
   }
   return Math.max(...obj[key]);
}

var output = getLargestElementAtProperty(obj, 'key');
console.log(output);

希望有帮助!

答案 1 :(得分:1)

您的函数返回1,因为for .. in循环立即返回在数组obj[key]中迭代的第一项。

考虑使用Array#reduce方法(如下所述)修改代码,以查找并返回输入数组的最大值:

var obj = {
  key: [1, 2, 4]
}
function getLargestElementAtProperty(obj, key) {
   if (!Array.isArray(obj[key])) {
      return undefined
   }
   
   var array = obj[key];
   
   /*
   Use reduce to iterate through each item in the array, comparing
   it with the previously found max value. Note that the first 
   iteration will find the max of the Math.max(1,1), which will 1
   */
   var max = array.reduce(function(currentMax, currentItem) {
      return Math.max(currentMax, currentItem)
   })
   
   return max;
}

var output = getLargestElementAtProperty(obj, 'key');
console.log(output); // --> expected 4

答案 2 :(得分:0)

因此,我找到了删除for循环并将.apply与Math.max结合使用的解决方案,并且我的代码被接受了,谢谢大家的帮助 这是我的新代码!

var obj = {
  key: [1, 2, 4]
}
function getLargestElementAtProperty(obj, key) {
   if (!Array.isArray(obj[key]) || obj[key].length === 0) {
      return undefined
   } else{
      return Math.max.apply(null, obj[key])
   }
}

var output = getLargestElementAtProperty(obj, 'key');
console.log(output); // --> expected 4