【问题标题】:How to find the largest number in an object using a for loop?如何使用 for 循环找到对象中的最大数?
【发布时间】:2021-01-10 05:49:45
【问题描述】:

这是我的数据集:

let items = [
  {
    itemName: "Effective Programming Habits",
    type: "book",
    price: 13.99
  },
  {
    itemName: "Creation 3005",
    type: "computer",
    price: 299.99
  },
  {
    itemName: "Finding Your Center",
    type: "book",
    price: 15.00
  }
]

我正在尝试使用 for 循环查找并返回此对象中的最大数字。我知道可能有更简单、更有效的路线,但我专门研究 for 循环。

我不想简单地返回最高价格,而是希望返回最高价格项目的 itemName。我的代码目前只返回最大价格:299.99,而不是 itemName“Creation 3005”。我将如何使用 for 循环返回此信息?这是我目前所拥有的。

function mostExpensiveItemName(items) {
  let expensive = items[0].price || null; 
  let number = null;
  let name = null;
  for (let i = 0; i < items.length; i++) {
    number = items[i].price;
    expensive = Math.max(expensive, number); 
    }
   return expensive;
  }

【问题讨论】:

    标签: javascript arrays for-loop return


    【解决方案1】:
    function mostExpensiveItemName(items) {
       let expensive = items[0]; 
       let number = null;
       let name = null;
       for (let i = 0; i < items.length; i++) {
          number = items[i];
          expensive = expensive.price < number.price ? number:;
       }
       return expensive;
    }
    

    【讨论】:

      【解决方案2】:

      我会做这样的事情。它更简洁、更具表现力,而且您不会将两个不同的问题混为一谈:

      • 找到最贵的商品,然后
      • 确定其名称
      function mostExpensiveItemName(items) {
        let item = mostExpensiveItem(items);
          return item ? item.Name : undefined;
      }
      
      function mostExpensiveItem(items) {
        let max;
      
        for ( const item of items ) {
           max = !item                  ? item   // 1st item in list
               : item.price > max.price ? item   // replace existing w/new most-expensive item
               :                          max  ; // keep existing
        }
      
        return max ;
      }
      

      【讨论】:

      • 如果您试图将关注点分开,这确实有意义。我会记住这一点,因为我认为拥有这两个功能更容易。您也可以稍后将它们组合起来并简化,但它肯定更容易阅读。
      • 应该始终尝试分离关注点。您最终会得到更简单的代码、更小、更可重用且更易于测试的函数。假设你给东西起有意义的名字,你最终得到的代码对于缺乏领域知识的新人来说更容易理解..
      【解决方案3】:

      如果您决定寻找for 循环的替代方案,使用reduce 可以非常容易地解决这些问题。

      const selectHigherPrice = (state, item) => state.price > item.price ? state : item
      
      const initialState = items[0]
      
      items.reduce(selectHigherPrice, initialState)
      
      // One line
      items.reduce((state, item) => state.price > item.price ? state : item)
      
      • state 被初始化为items 列表中的第一项
      • 为数组中的每个项目调用selectHigherPrice 函数
      • 如果当前state.price 属性大于item.price 属性:
        • state 返回
        • 否则,item 将被返回并在列表中的下一项调用 selectHigherPrice 时成为 state 变量。

      如果您确定您的列表将包含项目,您可以省略第二个参数

      【讨论】:

      • 感谢您提供替代方法并解释发生了什么。这将是解决此问题的一种更简单的方法。在查找了有关 reduce 数组方法的一些信息并按照您的回答之后,这是我知道必须存在的更简单方法的完美示例。我相信我会以更复杂的方式使用 reduce。感谢您的回答。
      • 没问题,欢迎来到 Stackoverflow。一旦你满意,别忘了让别人的回答被接受。如果你对这种编程风格感兴趣,我不能推荐this series more。
      • 我浏览了该站点并将其添加到书签以供将来参考。我仍处于编程之旅的开始阶段,但我确信随着我的进步,Ramda 会重新出现,我会更加努力地理解它。感谢您的资源。
      【解决方案4】:

      我会这样做:

      function mostExpensive(objArray){
        const m = objArray.map(o=>o.price);
        return objArray[m.indexOf(Math.max(...m))];
      }
      let items = [
        {
          itemName: "Effective Programming Habits",
          type: "book",
          price: 13.99
        },
        {
          itemName: "Creation 3005",
          type: "computer",
          price: 299.99
        },
        {
          itemName: "Finding Your Center",
          type: "book",
          price: 15.00
        }
      ];
      const me = mostExpensive(items);
      console.log(me); console.log(me.price);

      【讨论】:

        【解决方案5】:

        你可以像这样使用forEach

        let items = [
          {
            itemName: "Effective Programming Habits",
            type: "book",
            price: 13.99
          },
          {
            itemName: "Creation 3005",
            type: "computer",
            price: 299.99
          },
          {
            itemName: "Finding Your Center",
            type: "book",
            price: 15.00
          }
        ]
        
        let maxPrice = 0, product;
        items.forEach(el => {
          if(el.price > maxPrice){ 
             maxPrice = el.price;
             product = Object.assign({}, el); // for make sure you made a new copy not a reference 
          }
        });
        
        console.log(product, maxPrice)

        【讨论】:

          【解决方案6】:

          仅当您迭代的商品价格较高时才重新分配外部变量:

          let items = [
            {
              itemName: "Effective Programming Habits",
              type: "book",
              price: 13.99
            },
            {
              itemName: "Creation 3005",
              type: "computer",
              price: 299.99
            },
            {
              itemName: "Finding Your Center",
              type: "book",
              price: 15.00
            }
          ];
          function mostExpensiveItemName(items) {
            let highestPriceSoFar = 0;
            let nameOfHighestPriceSoFar;
            for (const { itemName, price } of items) {
              if (price > highestPriceSoFar) {
                highestPriceSoFar = price;
                nameOfHighestPriceSoFar = itemName;
              }
            }
            console.log(nameOfHighestPriceSoFar);
          }
          mostExpensiveItemName(items);

          【讨论】:

          • 哇。这是我在这里发布的第一个问题,如果我知道我可以在这么短的时间内得到如此全面的答案,我早就会问一个问题了。这正是我想要的。快速提问:for (const { itemName, price } of items) { 的行是否替换了 ```for(let i = 0; i
          • 我也喜欢这个答案,因为比如说数据集是一个购物车。将变量定义为空购物车或空数组的方式将返回 undefined 而不是 null。未定义的结果会立即引发一个标志,并导致人们像内置的安全条款一样检查他们的变量。
          • 我会假设那是实际循环通过数据集的行? 是的,它循环通过数组,但更简洁和抽象(这很好!)而不是搞乱指标。
          • 当一个答案解决了您的问题时,您可以考虑将其标记为已接受(选中左侧的复选框)以表明问题已解决:)
          猜你喜欢
          • 2021-10-20
          • 1970-01-01
          • 1970-01-01
          • 2017-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-08-11
          • 2016-08-05
          相关资源
          最近更新 更多