JSON - 操纵元素

时间:2014-08-26 14:10:10

标签: 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我想最终得到 -

[
 {
  "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个Pivot列。我可以并且可能会有更多,但我不知道,直到我从服务器返回JSON。

我如何做到这一点?

4 个答案:

答案 0 :(得分:1)

纯javascript解决方案
对于以“Pivot”开头的json中的所有键,在结果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_parsedjson var具有相同的顺序,您可以控制键顺序

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

答案 1 :(得分:0)

jQuery有一个.each()函数,在这里很有用。

看起来您必须进行两次通过,一次计算平均值,另一次计算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并使其成为%符号的字符串取决于您,但可以在第二个循环中完成。

答案 2 :(得分:0)

我还没有完成实际的计算逻辑,只是提供了一个默认值,你可以提出你的计算逻辑。 所有过程后的最终对象“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
            });
        });

希望这会有所帮助:)

答案 3 :(得分:-1)

首先将json转换为对象:

myJsonObj = JSON.parse(myJsonStr);

第二个操纵对象:

myJsonObj['Pivot1DFA'] = 125.000%;

第三次转换回json:

myJsonStr = JSON.stringify(myJsonObj);