使用Javascript计算多个动态值的百分比变化

3

我有一张表格,显示了一年中每个月的数值。它看起来大致如下:

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]

现在我希望“diff”行显示随着年份增长的百分比增加或减少。
2014年与2013年相比,2015年与2014年相比,以此类推...
我该如何从数组中获取96448和35780,并计算2014年的差异值,然后对表格中添加的每个新年执行相同操作?
96448 - 35780 = 60668 / 96448 = 0,629 * 100 = 62,9% 

当然,第一年(在这种情况下是2013年)没有区别。

1
为什么您的sum数组中最后一个值“48956”排在第一位? - RomanPerekhrest
抱歉,只是打错了。我写的时候可能有点累了。当然,数组是反过来的。 - Anton Bollen Forsberg
4个回答

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

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

感谢您提供的出色解决方案。特别感谢您提供使用对象的提示。 - Anton Bollen Forsberg
很高兴能够帮忙。需要补充的是,我给出的对象只是一个例子,对于你的sumsdiffs最好分别使用不同的对象来定义:) - malifa
推送到差异列表时,难道不应该使用先前值进行除法运算吗?@lexith - tlalco
1
@tlalco 你说得对。谢谢。我已经修复了它,并将其改为更现代的方式 ^^ - malifa

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]

0

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

使用JavaScript的JSFiddle


0

如果只是计算变化,您可以这样做:

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

它并不提供所有年份的差异。 - Nadeemmnn Mohd
你想始终相对于第一年进行变化吗? - Moritz
不,我想相对于去年有所改变。 - Anton Bollen Forsberg
但这就是发生的事情...... 我添加了sums数组,也许这会使它更清晰。 - Moritz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接