【问题标题】:How to use reduce to test an array for the Math.max function如何使用 reduce 测试 Math.max 函数的数组
【发布时间】:2020-01-04 15:49:13
【问题描述】:

我有一个由 range(i, (i + j)) 函数生成的数组,该函数使用两个计数器 i 和 j。 range 函数可以很好地生成 [3, 4, 5, 6] 类型的数组

一旦生成了这个数组,我想指向另一个名为 y 的数组中的对象 3、4、5 和 6。

在指向的每个对象中,我想要其值的键称为“权重”。

我想使用 Math.max 返回权重最大的那个。

谁能帮帮我,我是 JavaScript 新手,不太擅长这个。

谢谢。

我尝试了以下代码,但它给出了错误

var m = Math.min(   (   y[range(i, (i + j))].weight   )
)
console.log(m)

给出的错误是“无法读取未定义的属性‘权重’”。这是因为 range 函数返回一个我要测试的数字数组,所以它试图将其处理为:

var m = Math.min(   (   y[[3, 4, 5, 6]].weight   )
)
console.log(m)

而不是我希望看到的以下内容:

var m = Math.min(   (   y[3].weight   ), (   y[4].weight   ), (   y[5].weight   ),  (   y[6].weight   )
)
console.log(m)  

使用 reduce() 是否适合帮助代码按顺序运行 range 函数返回的数组中的每个数字,如果可以,如何实现 reduce()?

非常感谢,我真的很感激。

【问题讨论】:

  • Math.min(...y.slice(3,7).map(({weight}) => weight)) ?
  • 如果您的问题已得到解答,请将其标记为已关闭。
  • 我更新了问题以纳入给出的建议。它给出了一个新错误,它“无法读取未定义的属性‘扁豆’”
  • @tonypizza - 现在,您的ifelse 语句具有相同的确切语句,并且您的else 应该有一个== 而不是=。通过在for 循环内使用slice(),您正在处理目前仅可用的数据。很可能您不需要将slice() 放入for 循环中。看看我的回答:stackoverflow.com/a/57742901/2924577.
  • 嗨 Nikhil,我已经在更新 2 中发布了上面的工作代码。如果你能看一下它并告诉我如何实现扩展和切片函数来嵌套循环,我将不胜感激它。谢谢,谢谢

标签: javascript arrays range max reduce


【解决方案1】:

使用array.map() 代替spread syntax,如下所示:

const min = Math.min( ...( range(i, i+j).map(i => y[i].weight) ) );

ma​​p 运算符将使用回调函数的结果创建一个新数组,spread 语法(那些...)将'spread' 数组值就像它们是参数一样。

【讨论】:

    【解决方案2】:

    如果您只想使用range(i, i+j) 函数访问y 数组,则不需要使用它。

    您可以使用 JavaScript 的 slice() 方法从索引 ii+j+1 之间的 y 数组创建一个新数组。

    var y2 = y.slice(i, i+j+1);
    

    现在,您可以使用map() 方法从y2 数组的每个对象中创建一个仅包含weight 属性的新数组。

    var weights = y2.map(obj => obj.weight);
    

    要找到这些权重的最小值,您可以使用 JavaScript 的 Math.min() 函数。 Spread syntax 可用于将权重数组作为参数传递给 Math.min() 函数。

    var min = Math.min(...weights);
    

    演示:

    var y = [
      {"weight": 100, "a": 1, "b": 2},
      {"weight": 200, "a": 1, "b": 2},
      {"weight": 300, "a": 1, "b": 2},
      {"weight": 400, "a": 1, "b": 2},
      {"weight": 500, "a": 1, "b": 2}
     ]; 
    
    var i = 1, j= 2; // Values used in your range() function.
    
    var y2 = y.slice(i, i+j+1);
    
    var weights = y2.map(obj => obj.weight);
    
    console.log("All weights: " + weights);
    
    var min = Math.min(...weights);
    
    console.log("Minimum weight: " + min);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-01
      • 1970-01-01
      • 2020-03-26
      • 1970-01-01
      • 1970-01-01
      • 2019-04-25
      • 1970-01-01
      • 2022-10-13
      相关资源
      最近更新 更多