Javascript-将大型对象文字转换为另一个对象文字

Javascript-将大型对象文字转换为另一个对象文字,javascript,jquery,json,object,loops,Javascript,Jquery,Json,Object,Loops,我正在尝试将一个Javascript对象文字转换为另一个。我认为这是可能的一些循环,但我无法做到这一点。目标结构如下所示,“convertedData” 小提琴可以在这里找到: 以下是JSON数据: var data = { "29-10-2012": { "1a": { "allMovement": "1", "allLoad": "2", "loadMovement": "3" }, "

我正在尝试将一个Javascript对象文字转换为另一个。我认为这是可能的一些循环,但我无法做到这一点。目标结构如下所示,“convertedData”

小提琴可以在这里找到:

以下是JSON数据:

var data =

{
"29-10-2012": {
    "1a": {
            "allMovement": "1",
            "allLoad": "2",
            "loadMovement": "3"
    },
        "1b": {
            "allMovement": 4,
            "allLoad": 5,
            "loadMovement": 6
    }
},
    "22-02-2013": {
    "1a": {
            "allMovement": "7",
            "allLoad": "8",
            "loadMovement": "9"
    },
        "1b": {
            "allMovement": "10",
            "allLoad": "11",
            "loadMovement": "12"
    }
}
};

for (day in data) {

    for (id in data[day]) {

        document.write(data[day][id].allMovement+"<br>");
        document.write(data[day][id].allLoad+"<br>");
        document.write(data[day][id].loadMovement+"<br>");

    }
}

/*

convertedData = [[1,7],
             [2, 8],
             [3, 9],
             ["4","10"],
             ["5","11"],
             ["6", "12"]];


convertedData = [["1a-allMovement-29-10-2012","1a-allMovement-22-02-2013],
                 ["1a-allLoad-29-10-2012", "1a-allLoad22-02-2013"],
                 ["1a-loadMovement-29-10-2012", "1a-loadMovement-22-02-2013"],
                 ["1b-allMovement-29-10-2012","1a-allMovement-22-02-2013"],
                 ["1b-allLoad-29-10-2012","1b-allLoad22-02-2013"],
                 ["1b-loadMovement-29-10-2012", "1b-loadMovement-22-02-2013"]];

*/
var数据=
{
"29-10-2012": {
“1a”:{
“所有运动”:“1”,
“全部加载”:“2”,
“负载移动”:“3”
},
“1b”:{
“一切运动”:4,
“全部加载”:5,
“负载移动”:6
}
},
"22-02-2013": {
“1a”:{
“所有运动”:“7”,
“全部加载”:“8”,
“负载移动”:“9”
},
“1b”:{
“所有运动”:“10”,
“全部加载”:“11”,
“负载移动”:“12”
}
}
};
用于(数据中的日期){
for(数据中的id[天]){
document.write(数据[天][id].allMovement+“
”; document.write(数据[天][id].allLoad+“
”; document.write(数据[天][id].loadMovement+“
”; } } /* convertedData=[[1,7], [2, 8], [3, 9], ["4","10"], ["5","11"], ["6", "12"]]; 转换数据=[“1a-allMovement-29-10-2012”,“1a-allMovement-22-02-2013], [“1a-allLoad-29-10-2012”、“1a-allLoad22-02-2013”], [“1a-loadMovement-29-10-2012”、“1a-loadMovement-22-02-2013”], [“1b-allMovement-29-10-2012”、“1a-allMovement-22-02-2013”], [“1b-allLoad-29-10-2012”、“1b-allLoad22-02-2013”], [“1b-loadMovement-29-10-2012”、“1b-loadMovement-22-02-2013”]; */
试试这样的方法,根据需要进行调整:

var out = [],
    dateKey, idx, item, itemKey, inner;

for (dateKey in data) {
    if (data.hasOwnProperty(dateKey)) {
        idx = out.length;
        out[idx] = [];
        item = data[dateKey];
        for (itemKey in item) {
            if (item.hasOwnProperty(itemKey)) {
                inner = item[itemKey];
                out[idx].push(itemKey + '-' + inner.allMovement + '-' + inner.allLoad + '-' + inner.loadMovement);
            }
        } 
    }
}
console.log(out);

下面是一个使用jQuery.each()函数的解决方案:

var convertedObj = {};
$.each(data, function(i0,val0) {
    $.each(val0, function(i1,val1) {
        $.each(val1, function(i2,val2) {
            if (!convertedObj[i1+"-"+i2]) convertedObj[i1+"-"+i2] = [];
            convertedObj[i1+"-"+i2].push(val2);            
        });
    });
});
var convertedData = [];
$.each(convertedObj, function(i,val) {
    convertedData.push(val);
});
这是我的建议

(请参见控制台中的结果)

使用下划线.js:

var memo = {};

_.each(data, function (elem) { 
  _.each(elem, function (elem2, idx) {
    _.each (elem2, function(elem3, idx2) {
      if (typeof memo[idx + idx2] === 'undefined')
          memo[idx + idx2] = [];
      memo[idx + idx2].push(elem3);
    });
  });
});

memo = _.map(memo, function(e) { return e; });

// printing
document.write('[');
_.each(memo, function (e, idx) {
  document.write("[");
  _.each(e, function(ie, iidx) {
    if (typeof ie === 'string')
      document.write('"' + ie + '"');
    else
      document.write(ie);

    if (iidx != e.length - 1)
        document.write(",");
  });
  document.write("]");
  if (idx != memo.length - 1)
    document.write(",");
});
document.write(']');
输出为

[["1","7"],["2","8"],["3","9"],[4,"10"],[5,"11"],[6,"12"]]
jsbin链接->

我认为您的输入数据很混乱,因为它不符合类型的输出。除非它也是本练习的一部分…:-)

注:据我所知,你需要文字,这就是为什么有这一整节的文档。请写,但如果你不想打印它,你可以跳过它

mz演示版:

我在第2步中完成了这项工作,第一步是构造一个简单的结果,它解析原始数据对象并创建以数字为键的字符串文字,第二步是用相应的值更新
convertedData
var

var easyResult = {};
//first pass
$.each(data, function (d, o1) { //date, object1
    $.each (o1, function (t, o2) { //type, object2
        $.each(o2, function (s, n) { //string, ID
            easyResult[n] = t + '-' + s + '-' + d;
        });
    });
});

for (var i = 0; i < convertedData.length; i++ ) {
    for (var j = 0; j < convertedData[i].length; j++) {
        convertedData[i][j] = easyResult[""+convertedData[i][j]];
    }
}
var easyResult={};
//第一关
$.each(数据,函数(d,o1){//date,object1
$.each(o1,函数(t,o2){//类型,对象2
$.each(o2,函数(s,n){//string,ID
easyResult[n]=t+'-'+s+'-'+d;
});
});
});
对于(变量i=0;i
你的JSFIDLE没有为我加载。另外,你需要一个循环,可能是3。哈哈,我有一段时间以前在面试中问过这样的问题。有一个设定的深度,或者深度理论上是无限的吗?需要几个循环或递归。深度与示例中的一样,理论上不是无限的。即使我也无法创建和保存JSFIDLE为了告诉你这个问题,它现在没有加载。我不知道为什么。没有JSON对象。只有JSON字符串。你拥有的是JavaScript对象literal.Upvote。这是正确的方向,但它提供的不是我想要的。我已经更新了fiddle massiveley,请看一看!这是正确的d方向!