#javascript #arrays #for-loop #if-statement
#javascript #массивы #for-цикл #if-оператор
Вопрос:
У меня есть массив, включающий числа, где порядок массива фиксирован.
Я хотел бы посмотреть, сколько элементов я могу взять из этого массива с моим ordersize в JS
Мой код выдает неправильные результаты, например, на 500 единиц можно купить первые 2 элемента и 0,66 от 3-го элемента, так что всего можно взять 2,66, но код выдает 4. За 250 единиц я могу взять 1 элемент полностью и 0,75 от второго элемента, всего 1,75 можно взять, но код выдает 1,5.
Для 300 дает 2, это верно, но обычно дает неверный результат.
Я изменил строку результата внутри или снаружи условий for и if, это влияет на результат, но снова результаты неверны (для данного массива 2100 единиц ordersize будут принимать все элементы с 6 результатами)
function calculateOrder() {
var coinArray = [100, 200, 300, 400, 500, 600];
var orderSize = 500;
var sum = 0;
var i = 0;
for (i = 0; i < coinArray.length - 1; i ) {
if (sum < orderSize) {
sum = coinArray[i];
}
return i (orderSize - sum) / coinArray[i];
}
}
document.write(calculateOrder());
Ответ №1:
Используйте приведенный ниже код. Я исправил несколько вещей для вас.
- Создайте переменную для хранения текущей суммы денег, которая у вас есть. Таким образом, каждый раз, когда вы «покупаете» элемент, вы вычитаете то, что вы купили.
- Я изменил часть логики, чтобы заставить его работать. По сути, оператор return делит вашу текущую сумму денег на необходимую сумму, чтобы получить ту часть товара, которую вы можете купить, а затемопределяет количество товаров, которые вы уже купили.
- Кроме того, вам нужно иметь там else . Else выполняется, когда оператор if приводит к false, поэтому else выполняется, когда у вас недостаточно денег для покупки элемента.
return
сбой вашей функции, так что это одна из причин, по которой ваш предыдущий код работал некорректно. Цикл for будет выполняться один раз, а затем прерываться.for
Цикл должен завершиться наcoinArray.length
. Вы, вероятно, думали, что вам нужно- 1
там, поскольку индекс массива начинается с 0, за исключением того, что цикл for меньше, а не меньше или равен, он закончится на последнем индексе.
function calculateOrder(orderSize) {
var coinArray = [100, 200, 300, 400, 500, 600];
var amountOfMoney = orderSize;
for (var i = 0; i < coinArray.length; i ) {
if (amountOfMoney > coinArray[i]) {
amountOfMoney -= coinArray[i];
}
else {
return i amountOfMoney / coinArray[i];
}
}
}
document.write(calculateOrder(500));
Ответ №2:
В вашем коде есть три проблемы:
for
цикл выполняетif
инструкцию, затем выполняетreturn
инструкцию, чтобы она всегда возвращалась во время первой итерации.for
цикл должен повторяться до тех пор, покаi < coinArray.length
- Цикл, как написано, повторяется на один раз больше, чем нужно для того, чтобы значение в
return
операторе было правильным.
Вот версия, которая исправляет эти проблемы:
function calculateOrder() {
var coinArray = [100, 200, 300, 400, 500, 600];
var orderSize = 500;
var sum = 0;
var i = 0;
for (i = 0; i < coinArray.length; i ) {
if (sum coinArray[i] > orderSize) { // if orderSize is exceeded
return i ((orderSize - sum) / coinArray[i]); // 2 (0.66)
}
sum = coinArray[i]; // else add to sum
}
}
document.write(calculateOrder());