【问题标题】:Calculate percent change over multiple dynamic values with Javascript使用 Javascript 计算多个动态值的百分比变化
【发布时间】:2016-10-31 18:20:55
【问题描述】:

我有一个表格显示一年中每个月的值。它看起来像:

Month |  2015  |
----------------
Jan   |  4856  |
Feb   |  6521  |
Mar   |  ....  |
Apr   |  ....  |
May   |  ....  |
Jun   |  ....  |
Jul   |  ....  |
Aug   |  ....  |
Sep   |  ....  |
Oct   |  ....  |
Nov   |  ....  |
Dec   |  ....  |
----------------
SUM   |  48956 |

我有一个像这样收集所有 SUM 值的数组:

sum = [48956]

然后用户可以选择向表中添加更多年份的值,例如:

Month |  2013  |  2014  |  2015  |
----------------------------------
Jan   |  6587  |  8954  |  4856  |
Feb   |  1254  |  1125  |  6521  |
Mar   |  ....  |  ....  |  ....  |
Apr   |  ....  |  ....  |  ....  |
May   |  ....  |  ....  |  ....  |
Jun   |  ....  |  ....  |  ....  |
Jul   |  ....  |  ....  |  ....  |
Aug   |  ....  |  ....  |  ....  |
Sep   |  ....  |  ....  |  ....  |
Oct   |  ....  |  ....  |  ....  |
Nov   |  ....  |  ....  |  ....  |
Dec   |  ....  |  ....  |  ....  |
----------------------------------
SUM   |  35780 |  96448 |  48956 |
----------------------------------
diff  |        | %change| %change|

数组现在看起来像:

sum = [35780, 96448, 48956]

现在我希望“差异”行显示多年来百分比的增加或减少。
2014年对比2013年,2015年对比2014年等等..

我怎样才能抓住前任。数组中的 96448 和 35780 并计算 2014 年的 diff 值,然后将相同的每个新年添加到表中?

96448 - 35780 = 60668 / 96448 = 0,629 * 100 = 62,9% 

当然第一年(在这种情况下是 2013 年)没有差异。

【问题讨论】:

  • 为什么最后一个值 48956 在你的 sum 数组中排在第一位?
  • 抱歉,打错字了。觉得写的时候有点累。当然数组是相反的。

标签: javascript arrays math diff percentage


【解决方案1】:

使用Array.reduce函数的解决方案:

var sum = [35780, 96448, 48956],
    diff = ['-'];  // first column is empty '-'

sum.reduce(function (a, b) {
    if (a === 0) return b;
    var isNegative = b - a < 0;
    diff.push(parseInt((b - a) / (isNegative? a : b) * 100));
    return b;
}, 0);

console.log(diff);  // ["-", 62, -49]

【讨论】:

    【解决方案2】:
    const values = [10000, 20000, 25000, 5000]; // values per year sorted ascending
    
    const increases = values.map((currVal, index) => {
        if (index === 0) {
            return;
        }
    
        const prevVal = values[index - 1];
        return ((currVal - prevVal) / prevVal) * 100;
    }).filter(Boolean);
    
    console.log(increases); // [100, 25, -80] values in percent
    

    这将返回一个列表,其中包含您每年的增长 (%)。

    【讨论】:

    • 感谢您提供出色的解决方案。并特别感谢您提供使用对象的提示。
    • 乐于助人。补充一点:我展示的对象当然只是一个示例,为您的sums 和一个为您的diffs 或类似的对象设置单独的对象可能更有意义:)
    • 推到差异列表时不应该除之前的值吗? @lexith
    • @tlalco 你是对的。谢谢你。修复它并将其更改为更现代的方式^^
    【解决方案3】:

    jsFiddle

    使用 jquery 编写代码

     var arr=[48956, 96448, 35780];
            //var arr=[96448, 35780];         
              var diff=[];
              $.each(arr,function(i,v){
               //96448 - 35780 = 60668 / 96448 = 0,629 * 100 = 62,9%
               if(i==arr.length-1){
                diff.push('---');
                return;
               }
               var first=v;
               var second=arr[i+1];
                 var calc =(((first - second)/first)*100).toFixed(2)+'%';
                 diff.push(calc);
              });
              alert(diff.toString());
    

    使用 Javascript 编写代码

     var arr=[48956, 96448, 35780];
            //var arr=[96448, 35780];         
              var diff=[];
              for(var i=0;i<arr.length;i++)
          {
               //96448 - 35780 = 60668 / 96448 = 0,629 * 100 = 62,9%
               if(i==arr.length-1){
                diff.push('---');
                }else{
                var first=arr[i];
                var second=arr[i+1];
                var calc =(((first - second)/first)*100).toFixed(2)+'%';
                diff.push(calc);
                }
              }
              alert(diff.toString());
    

    JSFiddle using javascript

    【讨论】:

      【解决方案4】:

      要计算更改,您可以执行以下操作:

      let sums = [35780, 96448, 48956];
      let changes = [];
      for (let i = 1; i < sums.length; i++) {
          changes[i] = sums[i] / sums[i-1] * 100; 
      }
      

      【讨论】:

      • 它并没有给出所有年份的差异
      • 您希望始终拥有相对于第一年的变化?
      • 不,我想要相对于上一年的变化。
      • 但这就是发生的事情......我添加了 sums 数组,也许这很清楚。
      猜你喜欢
      • 2015-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-08
      相关资源
      最近更新 更多