Как найти наибольшее число в объекте с помощью цикла for?

#javascript #arrays #for-loop #return

#javascript #массивы #for-цикл #Возврат

Вопрос:

Вот мой набор данных:

 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, а не имя элемента «Создание 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;
  }
  

Ответ №1:

Переназначайте внешнюю переменную, только если элемент, который вы перебираете, имеет более высокую цену:

 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);  

Комментарии:

1. Вау. Это был мой первый вопрос, опубликованный здесь, и если бы я знал, что смогу получить такой исчерпывающий ответ за такое короткое время, я бы задал вопрос давным-давно. Это было именно то, что я искал. Быстрый вопрос: строка, которая гласит for (const { itemName, price } of items) { , заменяет «для (пусть i = 0; i < элементы. длина, i )`? Я бы предположил, что это строка, которая фактически проходит через набор данных?

2. Мне также нравится этот ответ, потому что, скажем, например, набор данных был корзиной покупок. То, как переменные определяются как пустая корзина или пустой массив, будет возвращать undefined вместо null . Неопределенный результат немедленно поднимет флаг и заставит проверять свои переменные, как встроенное условие безопасности.

3. Я бы предположил, что это строка, которая фактически проходит через набор данных? Да, он перебирает массив, но он более лаконичный и абстрактный (что хорошо!), Чем возня с указателями.

4. Когда ответ решит вашу проблему, вы можете пометить его как принятый (установите флажок слева), чтобы указать, что проблема решена 🙂

Ответ №2:

вы могли бы использовать 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)  

Ответ №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 случае возвращается и становится state переменной при selectHigherPrice вызове для следующего элемента в списке.

Если вы уверены, что в вашем списке будут элементы, вы можете опустить второй аргумент

Комментарии:

1. Я ценю, что вы предоставили альтернативный метод, а также объяснили, что происходит. Это было бы гораздо более простым способом решения этой проблемы. После просмотра некоторой информации о методе reduce array и после вашего ответа, это прекрасный пример более простого метода, который, как я знал, должен был существовать. Я уверен, что смогу использовать reduce еще более сложными способами. Спасибо за ответ.

2. Нет проблем, добро пожаловать в Stackoverflow. Не забудьте сделать чей-то ответ принятым, как только вы будете удовлетворены. Если вас интересует этот стиль программирования, я не могу рекомендовать эту серию больше.

3. Я просмотрел сайт и добавил его в закладки для дальнейшего использования. Я все еще в начале своего пути программирования, но я уверен, что по мере того, как я буду продвигаться дальше, 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:

Я бы сделал что-то вроде этого. Это чище, выразительнее, и вы не объединяете две разные проблемы:

  • поиск самого дорогого элемента и
  • определение его имени
 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 ;
}
  

Комментарии:

1. Это имеет смысл, если вы пытаетесь разделить проблемы. Я буду иметь это в виду, потому что, на мой взгляд, использовать две функции проще. Вы также можете объединить их позже и упростить, но это определенно проще для чтения.

2. Всегда следует стараться разделять проблемы. В итоге вы получаете более простой код, меньшие по размеру, более повторно используемые функции, которые легче тестировать. И если предположить, что вы даете вещам осмысленные имена, вы получаете код, который намного проще понять новичку, которому не хватает знаний в предметной области..

Ответ №6:

 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;
}