【问题标题】:jQuery - Calculate percentage based on multiple conditionsjQuery - 根据多个条件计算百分比
【发布时间】:2020-07-18 09:07:57
【问题描述】:

我有以下代码:

   <script type="application/javascript"> 

    $(document).ready(function () {

        $("#market_value").on("change paste keyup", function() {
            
          var market_value = parseInt($(this).val());
            
          var data = [
          {"percent":"10","market_value":"10000"},
          {"percent":"20","market_value":"10001"},
          {"percent":"25","market_value":"20000"}
          ];
      
          for (var x in data) {
          
           if(market_value >= parseInt(data[x].market_value)) {
      
           console.log(percentage(market_value, data[x].percent));
           
           }
        
       };
           
        });
        
    function percentage(num, per)
    {
      return (num/100)*per;
    }
        
        
    });
    
    </script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>



<input type="text" class="form-control" id="market_value" name="market_value" value="">

我只需要一个简单的代码来根据 JSON 数据列表计算市场价值的百分比。

例如:

如果我输入 8000 结果必须是 800(10% 基于“百分比”字段)。

如果我输入 11000 结果必须是 2200(20% 基于“百分比”字段,因为高于 10001)

如果我输入 50000 结果必须是 12500(25% 基于“百分比”字段,因为高于 20000)

如果我输入 3000 结果必须是 300(10% 基于“百分比”字段,因为不高于 10000)

我编写的代码以某种方式工作,但如果我输入一个低于 10000 的数字,则没有任何显示。

这些不是固定值,数据 (JSON) 是动态的。

【问题讨论】:

  • "但是如果我输入一个低于 10000 的数字,则什么都不会显示" - 因为data 中没有对象,market_value 低于 10000
  • @Andreas 所说的,如果你在 json 中使用数字而不是字符串,你也不需要 parseInt 并且你应该用一个 break 反向迭代它们,否则它会给你多个真实的条件。
  • @Andreas 是的,你说得对,但我需要以某种方式使其在 0 - 10000 和 10001 - 20000 等范围内工作
  • @John 是的,它返回多个真实条件,我将尝试使用 break;
  • @GeorgeGeorge 为值 0 添加一个条目

标签: javascript jquery arrays json math


【解决方案1】:

正如@Andreas@ 和@John@ 正确指出的那样,循环将在没有任何操作的情况下结束:

for (var x in data) {
    if(market_value >= parseInt(data[x].market_value)) {    // never happens for <10000
    console.log(percentage(market_value, data[x].percent));
}

为什么?

假设我们给market_value = 5555
现在随着for 走下去,在您的情况下,它将执行以下比较:

if( 5555 >= 10000 ) { ... }
if( 5555 >= 10001 ) { ... }
if( 5555 >= 10002 ) { ... }

所有这些条件都会给你false。这就是问题的核心。

建议修复它

  • 要么引入第四个具有下限(例如零)的条件
  • 或者您在 for 循环之后管理“以上都不是”的情况。

【讨论】:

  • 非常感谢您的回答,按照您的建议,我设法在循环后通过“以上都不是”的情况来修复它。
【解决方案2】:

我设法以这种方式解决了它:

var data = [
      {"percent":"10","market_value":"10000"},
      {"percent":"25","market_value":"20000"},
      {"percent":"20","market_value":"10001"}
      ];

   sorted_data = sortByKeyDesc(data, "market_value");

   for (var x in sorted_data) {
  
   if(market_value >= parseInt(sorted_data[x].market_value)) {

   console.log(percentage(market_value, sorted_data[x].percent));

   break;

   }else if(market_value){
   console.log(percentage(market_value, sorted_data[x].percent));   
   }


 function sortByKeyDesc(array, key) {
    return array.sort(function (a, b) {
        var x = a[key]; var y = b[key];
        return ((x > y) ? -1 : ((x < y) ? 1 : 0));
    });
}

因为 json 数据有时不能按那个顺序(从最低到最高),所以我首先按最高的 market_value 对它们进行排序,然后运行百分比函数。如果值为 1 - 10000,则应用 10%(即最后一行)

我不知道这有多脏,但效果很好。如果其他人有更好的想法,我会很高兴看到它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 2021-03-16
    相关资源
    最近更新 更多