Are you sure you want to go to an external site to donate a monetary value?
WARNING: Some countries laws may supersede the payment processors policy such as the GDPR and PayPal. While it is highly appreciated to donate, please check with your countries privacy and identity laws regarding privacy of information first. Use at your utmost discretion.
Создал новый тикет, потому что старый не смог переоткрыть.
Пересмотрел ещё раз всю функцию целиком.
Переделал так:
function createCalculationForItem(item) { $("#cwas-price-calculator-calculate").click(function(){ var startLvl = parseInt($("#cwas-price-calculator-startLvl").val()); var endLvl = parseInt($("#cwas-price-calculator-endLvl").val()); var results = $("#cwas-price-calculator-results"); results.children().remove(); var resourceDict = {}; for (var updateLvl = startLvl + 1; updateLvl <= endLvl; updateLvl++) { var levelPrice = item.price(updateLvl); for (var resourceName in levelPrice) { var resourceAmount = levelPrice[resourceName]; if (resourceAmount > 0) { if (resourceDict[resourceName] === undefined) { resourceDict[resourceName] = 0; } resourceDict[resourceName] += resourceAmount; } } } for (var r in resourceDict) { if (r !== 'time') { results.append(createResourceSection(r, resourceDict[r])); } } results.append(createResourceSection('time', formatTimeFromSeconds(resourceDict.time))); }); }
За один цикл одновременно собираем и нужные ресурсы и их количество.
Проходимся только по нужным уровням.
Значения с ресурсом, равным 0, отфильтровываем.
Если добавить в конец функции createCalculationInterface
$('#cwas-price-calculator-startLvl').val(item.currentLevel());
не прийдётся каждый раз вводить текущий уровень в поле начального значения калькулятора
Пересмотрел ещё раз всю функцию целиком.
Переделал так:
function createCalculationForItem(item) { $("#cwas-price-calculator-calculate").click(function(){ var startLvl = parseInt($("#cwas-price-calculator-startLvl").val()); var endLvl = parseInt($("#cwas-price-calculator-endLvl").val()); var results = $("#cwas-price-calculator-results"); results.children().remove(); var resourceDict = {}; for (var updateLvl = startLvl + 1; updateLvl <= endLvl; updateLvl++) { var levelPrice = item.price(updateLvl); for (var resourceName in levelPrice) { var resourceAmount = levelPrice[resourceName]; if (resourceAmount > 0) { if (resourceDict[resourceName] === undefined) { resourceDict[resourceName] = 0; } resourceDict[resourceName] += resourceAmount; } } } for (var r in resourceDict) { if (r !== 'time') { results.append(createResourceSection(r, resourceDict[r])); } } results.append(createResourceSection('time', formatTimeFromSeconds(resourceDict.time))); }); }
За один цикл одновременно собираются и нужные ресурсы и их количество.
Проходимся только по нужным уровням.
Те уровни, на которых ресурс объявлен, но равен 0, не попадают в результат.
Прошу прощения, недокопипастил:
var startTier = Math.trunc(startLvl / 20); var endTier = Math.trunc((endLvl - 1) / 20); for (var currTier = startTier; currTier <= endTier; currTier++) { var additionalResourceNames = Object.keys(item.price((20 * currTier) + 1)); for (var i = additionalResourceNames.length - 1; i >= 0; i--) { if (resourceNames.indexOf(additionalResourceNames[i]) === -1) { resourceNames.push(additionalResourceNames[i]); } } }
Цикл
while (endLvl - (startLvl + 20 * lvlMult++) > 20) { var additionalResourceNames = Object.keys(item.price((startLvl + 20 * lvlMult) + 1)); for (var i = additionalResourceNames.length - 1; i >= 0; i--) { if (resourceNames.indexOf(additionalResourceNames[i]) === -1) { resourceNames.push(additionalResourceNames[i]); } } }
не собирает последний доп. ресурс, если разница между начальным и конечным уровнем меньше 20
предлагаю такой вариант:
var startTier = Math.trunc(startLvl / 20); var endTier = Math.trunc((endLvl - 1) / 20); for (var currTier = startTier; currTier <= endTier; currTier++) var additionalResourceNames = Object.keys(item.price((20 * currTier) + 1)); for (var i = additionalResourceNames.length - 1; i >= 0; i--) { if (resourceNames.indexOf(additionalResourceNames[i]) === -1) { resourceNames.push(additionalResourceNames[i]); } }