javascript - 在 jquery 中创建新的垂直 json 到水平

标签 javascript jquery json

我有一个如下所示的 JSON

 var data = [

        { "year": 2013, "month": 10, "week": 41, "changes": 1590 },
        { "year": 2013, "month": 10, "week": 42, "changes": 0 },
        { "year": 2013, "month": 10, "week": 43, "changes": 2008 },
        { "year": 2013, "month": 10, "week": 44, "changes": 3900 },
        { "year": 2014, "month": 10, "week": 41, "changes": 1052 },
        { "year": 2014, "month": 10, "week": 42, "changes": 0 },
        { "year": 2014, "month": 10, "week": 43, "changes": 10122 },
        { "year": 2014, "month": 10, "week": 44, "changes": 1461 },
        { "year": 2015, "month": 10, "week": 41, "changes": 682 },
        { "year": 2015, "month": 10, "week": 42, "changes": 0 },
        { "year": 2015, "month": 10, "week": 43, "changes": 244 },
        { "year": 2015, "month": 10, "week": 44, "changes": 21 }

    ];

我想生成这个 JSON 之类的东西

var firstYear = "2013";
    var secondYear = "2014";
    var thildYear = "2015";

    var sampleData = [
        { "week": 41, "firstYear": 1590, "secondYear": 1052, "thildYear": 682 },
        { "week": 42, "firstYear": 0, "secondYear": 0, "thildYear": 0 },
        { "week": 43, "firstYear": 2008, "secondYear": 10122, "thildYear": 244 },
        { "week": 44, "firstYear": 858, "secondYear": 1461, "thildYear": 21 }
    ];

我写了一段代码,但它不起作用

  var jsonObjdata = [];
    var yearExist = "";
    var weekExist = "";
    var SampleRequestBody = {};
    $.each(data, function (key, value) {
        if (value.year != yearExist) {
            SampleRequestBody.week = value.week;
            SampleRequestBody.firstYear = value.changes;
            yearExist = value.year;
        }
        else if (value.year == yearExist && value.week == weekExist + 1) {
            SampleRequestBody.secondYear = value.changes;
        }
        else if (value.year == yearExist && value.week == weekExist + 1) {
            SampleRequestBody.thildYear = value.changes;
            jsonObjdata.push(SampleRequestBody);
        } 
    });

你能帮我吗?

最佳答案

这是使用 array.prototype.reduce 的另一种方式。 :

var weeks = [], flatData;
flatData = data.reduce(function(outData, obj) {
    var tmp = {}, prop = 'year' + obj.year;
    if ((idx = weeks.indexOf(obj.week)) >= 0) {
        outData[idx][prop] = obj.changes;
    } else {
        weeks.push(obj.week);
        tmp['week'] = obj.week;
        tmp[prop] = obj.changes;
        outData.push(tmp);
    }
    return outData;
}, []);

它将返回一个像这样的对象数组:

week    year2013    year2014    year2015
----    --------    --------    --------
41      1590        1052        682
42      0           0           0
43      2008        10122       244
44      3900        1461        21

演示 fiddle :http://jsfiddle.net/abhitalks/kLg5f1wk/ (检查控制台)

演示片段: (检查控制台)

var data = [
        { "year": 2013, "month": 10, "week": 41, "changes": 1590 },
        { "year": 2013, "month": 10, "week": 42, "changes": 0 },
        { "year": 2013, "month": 10, "week": 43, "changes": 2008 },
        { "year": 2013, "month": 10, "week": 44, "changes": 3900 },
        { "year": 2014, "month": 10, "week": 41, "changes": 1052 },
        { "year": 2014, "month": 10, "week": 42, "changes": 0 },
        { "year": 2014, "month": 10, "week": 43, "changes": 10122 },
        { "year": 2014, "month": 10, "week": 44, "changes": 1461 },
        { "year": 2015, "month": 10, "week": 41, "changes": 682 },
        { "year": 2015, "month": 10, "week": 42, "changes": 0 },
        { "year": 2015, "month": 10, "week": 43, "changes": 244 },
        { "year": 2015, "month": 10, "week": 44, "changes": 21 }

], weeks = [], flatData;

flatData = data.reduce(function(outData, obj) {
    var tmp = {}, prop = 'year' + obj.year;
    if ((idx = weeks.indexOf(obj.week)) >= 0) {
        outData[idx][prop] = obj.changes;
    } else {
        weeks.push(obj.week);
        tmp['week'] = obj.week;
        tmp[prop] = obj.changes;
        outData.push(tmp);
    }
    return outData;
}, []);

console.table(flatData);

关于javascript - 在 jquery 中创建新的垂直 json 到水平,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33539276/

相关文章:

jquery - 对由 Json 数组填充的 JQuery 列表进行排序

javascript - 在 beforeprint 事件上使用 JQuery

javascript - 如何扩展 iFrame/将内容从 iFrame 移动到 div?

javascript - parse.com javascript 中的用户安全

javascript - 在 trim() 之后获取字符串的最后一个字符不起作用

javascript - 隐藏第一个面板上的导航 - PanelSnap 插件

c++ - 在提供 JSON 数据的 C++/Qt(充当服务器)中创建简单的 WebService

json - 不使用 for 语句解析 JSON 数组

javascript - 获取 xml 节点的第一个子节点

javascript - 如何在 HTML 中使用 fs.writeFile(使用 node.JS)?