Javascript JSON操作元素

Javascript JSON操作元素,javascript,jquery,json,Javascript,Jquery,Json,我有一个JSON,看起来像- [ { "Metric": "7e70661f-e266-4745-9b1b-c5c5691e9746", "Pivot1": 40.00000, "Pivot2": 38.00000, "Pivot3": 18.00000, "Total": 96.00000, "Average": 32.00000, "IsTotal": 0, "MetricOrder": 1 } ] 使用javascript和/或jQuery,我想以-

我有一个JSON,看起来像-

[
 {
  "Metric": "7e70661f-e266-4745-9b1b-c5c5691e9746",
  "Pivot1": 40.00000,
  "Pivot2": 38.00000,
  "Pivot3": 18.00000,
  "Total": 96.00000,
  "Average": 32.00000,
  "IsTotal": 0,
  "MetricOrder": 1
 }
]
使用javascript和/或jQuery,我想以-

[
 {
  "Metric":"7e70661f-e266-4745-9b1b-c5c5691e9746",
  "Pivot1":40.00000,
  "Pivot1DFA": 125.000%,
  "Pivot2":38.00000,
  "Pivot2DFA": 118.750%,
  "Pivot3":18.00000,
  "Pivot3DFA": 56.250%,
  "Total":96.00000,
  "Average":32.00000,
  "IsTotal":0,
  "MetricOrder":1
 }
]
DFA表示与平均值的差异

在本例中,我有3个轴列。我可以而且可能会有更多,但我不知道,直到我从服务器上得到JSON

如何实现这一点?

jQuery有一个。每个函数在这里都很有用

看起来你必须通过两次,一次计算平均值,另一次计算DFA

var values = [{"Metric": "7e70661f-e266-4745-9b1b-c5c5691e9746",
               "Pivot1": 40.00000,
               "Pivot2": 38.00000,
               "Pivot3": 18.00000,
               "Total": 96.00000,
               "Average": 32.00000,
               "IsTotal": 0,
               "MetricOrder": 1
              }];

var totals = {};
var count = values.length;
$.each(values, function(idx, obj){
    $.each(obj, function(idx2, val){
        if(idx2.indexOf('Pivot') == 0){
            if(typeof totals[idx2] == 'undefined'){
                totals[idx2] = 0.0;
            }
            totals[idx2] += obj[idx2];
        }
    });
});
$.each(values, function(idx, obj){
    $.each(obj, function(idx2, val){
        if(idx2.indexOf('Pivot') == 0){
            obj[idx2+'DFA'] = totals[idx2] / obj[idx2];
        }
    });
});
console.log(values);
然后,不管你想用什么方法来计算百分比,乘以100,并使其成为一个带有%符号的字符串,这取决于你自己,但可以在第二个循环中完成。

纯javascript解决方案对于以Pivot开头的json中的所有键,在result json中添加一个带有所需操作的键

json = {"Metric": "7e70661f-e266-4745-9b1b-c5c5691e9746",
        "Pivot1": 40.00000,
        "Pivot2": 38.00000,
        "Pivot3": 18.00000,
        "Total": 96.00000,
        "Average": 32.00000,
        "IsTotal": 0,
        "MetricOrder": 1
}
json_parsed = {}
Object.keys(json).forEach(
    function(e){ 
        json_parsed[e] = json[e]
        if(e.indexOf("Pivot") === 0){
            var avg = json["Average"]
            json_parsed[e+"DFA"] = ((json[e] / avg ) * 100.0) +"%"
        }
    }
)
使用此解决方案,json_解析的顺序与json var相同,您可以控制键顺序

>>>> Object.keys(json_parsed)
>>>> ["Metric", "Pivot1", "Pivot1DFA", "Pivot2", "Pivot2DFA", "Pivot3", "Pivot3DFA", "Total", "Average", "IsTotal", "MetricOrder"]

首先将json转换为对象:

myJsonObj = JSON.parse(myJsonStr);
第二个操纵对象:

myJsonObj['Pivot1DFA'] = 125.000%;
等等

第三次转换回json:

myJsonStr = JSON.stringify(myJsonObj);

我没有做实际的计算逻辑,只是提供了一个默认值,你可以把你的计算逻辑。 最后一个对象jsonData经过所有处理后,将为您提供所需的输出

        var jsonData = [
                        {
                            "Metric": "7e70661f-e266-4745-9b1b-c5c5691e9746",
                            "Pivot1": 40,
                            "Pivot2": 38,
                            "Pivot3": 18,
                            "Total": 96,
                            "Average": 32,
                            "IsTotal": 0,
                            "MetricOrder": 1
                        }
                    ];
        var properties = [];
        for (var o in jsonData[0]) {
            if (o.indexOf('Pivot') > -1)
                properties.push(o);
        }
        $.each(jsonData, function (index, value) {
            $.each(properties, function (idx, val) {
                var currentValue = value[val];
                value[val + 'DFA'] = "0"; //your calculation logic to be done here
            });
        });

希望这有帮助:

有没有一种方法可以计算DFA或是静态的?Pivot1DFA=parseFloatPivot1/Average*100.toFixed3+%;这仅在始终有3个元素时有效。在从服务器返回数据之前,数据透视列的数量是未知的。它是否总是被称为数据透视?或者您可以传递一个参数,该参数表示有多少个轴列?它将始终是Pivot@duckmike好的,我将代码更新为pivot不可知。这回答了这里的6个问题之一。有没有办法让json恢复到原始顺序,并在适当的地方插入“DFA”元素?