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

时间:2016-06-29 07:19:45

标签: javascript arrays math diff percentage

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

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年)没有差异。

4 个答案:

答案 0 :(得分: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]

答案 1 :(得分: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());

JSFiddle using javascript

答案 2 :(得分:0)

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

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

答案 3 :(得分:-1)

以下示例包含条件,即您的年份值在数组中按升序排序(此处为arr):

var arr = [10000, 20000, 25000, 5000];

var diffs = [];
var previousYearVal;

arr.map(function(yearVal) {
    if(previousYearVal){
        diffs.push( ((yearVal - previousYearVal) / yearVal) * 100 );
    }

    previousYearVal = yearVal;
});

console.log(diffs); // [50, 20, -400] values in percent

这将返回一个diffs数组,其值在sum数组中排序,这意味着第一个值表示数组中前两年值的差异(在我的示例中为10000) ,20000)。

但是如果您使用这样的数据,我会尝试使用Object,这样可以让您更轻松地计算和参考年份。

例如,您应该考虑这样的结构:

{
    years: {
       2015: [ JanuaryValue, FebruaryValue ... ],
       2016: [ ... ]
    }
    differenceToYearBefore: {
       2015: diffValue,
       2016: diffValue
    }
}

如果你有这样的话,那么你可以更容易地遍历你的对象,同时使用键来访问正确的值来读/写而不是遍历数组而不知道你正在访问哪个值(没有& #34;你头脑中的规则&#34;)。