在javascript中更改JSON响应

时间:2017-09-18 06:51:06

标签: javascript json

我正在研究WEB API,我收到了来自服务器的JSON响应,现在我想将返回的响应更改为不同的JSON以显示不同的表格和图形。

这是来自服务器的响应

{"data":[{"id":3663101,"lstImeis":[{"number":"14370340908558","maxDate":"2017-08-24 22:08:58.0","minDate":"2017-08-24 22:08:58.0"},{"number":"22418344742097","maxDate":"2017-08-24 18:08:56.0","minDate":"2017-08-24 18:08:56.0"}],"number2":789},{"id":3665337,"lstImeis":[{"number":"48717031235502","maxDate":"2017-08-24 21:09:38.0","minDate":"2017-08-24 21:09:38.0"},{"number":"42540009239622","maxDate":"2017-08-24 16:35:08.0","minDate":"2017-08-24 16:35:08.0"},{"number":"42540009239644","maxDate":"2017-08-24 16:35:08.0","minDate":"2017-08-24 16:35:08.0"}],"number2":456}]}

我需要将此响应转换为如下所示:

{"data":[{"id":3663101,"number":"14370340908558","maxDate":"2017-08-24 22:08:58.0","minDate":"2017-08-24 22:08:58.0","number2":789},{"id":3663101,"number":"22418344742097","maxDate":"2017-08-24 18:08:56.0","minDate":"2017-08-24 18:08:56.0","number2":789},{"id":3665337,"number":"48717031235502","maxDate":"2017-08-24 21:09:38.0","minDate":"2017-08-24 21:09:38.0","number2":456},{"id":3665337,"number":"42540009239622","maxDate":"2017-08-24 16:35:08.0","minDate":"2017-08-24 16:35:08.0","number2":456},{"id":3665337,"number":"42540009239644","maxDate":"2017-08-24 16:35:08.0","minDate":"2017-08-24 16:35:08.0","number2":456}]}

这是我到目前为止所做的,

var data = new Array();
var str = '{"data":[{"id":3663101,"lstImeis":[{"number":"14370340908558","maxDate":"2017-08-24 22:08:58.0","minDate":"2017-08-24 22:08:58.0"},{"number":"22418344742097","maxDate":"2017-08-24 18:08:56.0","minDate":"2017-08-24 18:08:56.0"}],"number2":789},{"id":3665337,"lstImeis":[{"number":"48717031235502","maxDate":"2017-08-24 21:09:38.0","minDate":"2017-08-24 21:09:38.0"},{"number":"42540009239622","maxDate":"2017-08-24 16:35:08.0","minDate":"2017-08-24 16:35:08.0"},{"number":"42540009239644","maxDate":"2017-08-24 16:35:08.0","minDate":"2017-08-24 16:35:08.0"}],"number2":456}]}';
var response = JSON.parse(str);
var tableData = response.data;
var dataLength = response.data.length;

for (i = 0; i < dataLength; i++) {
    var obj = {};
    obj["id"] = tableData[i].id;
    for (a = 0; a < tableData[i].lstImeis.length; a++) {
        obj["number"] = tableData[i].lstImeis[a].number,
        obj["maxDate"] = tableData[i].lstImeis[a].maxDate,
        obj["minDate"] = tableData[i].lstImeis[a].minDate
    }
    obj["number2"] = tableData[i].number2;
    data.push(obj);
}
console.log(JSON.stringify(data));

这是JSFIDDLE

外部循环可以处理罚款,但内部循环会提供最新更新的数据。如果查看给定数据和更改的数据,您将看到差异。 任何想法,为什么它覆盖内部for循环中的值并仅将最后一个值附加到obj

4 个答案:

答案 0 :(得分:4)

你的逻辑是错误的行

var obj = {};
obj["id"] = tableData[i].id;

应该在内部循环内。也行

obj["number2"] = tableData[i].number2;
data.push(obj);

应该在内循环内移动。 以下是改进且有效的代码https://jsfiddle.net/dmtfxt35/4/

var response = JSON.parse(str); 
var tableData = response.data;
var finalObj = {data:[]};
for (var i in tableData){
    for(var a in tableData[i].lstImeis){
    var tmpObj = {};
    tmpObj['id'] = tableData[i].id;
    tmpObj["number"] = tableData[i].lstImeis[a].number;
    tmpObj["maxDate"] = tableData[i].lstImeis[a].maxDate;
    tmpObj["minDate"] = tableData[i].lstImeis[a].minDate;
    tmpObj["number2"] = tableData[i].number2;
    finalObj.data.push(tmpObj);
  }
}
console.log(JSON.stringify(finalObj));

我希望这会有所帮助。

答案 1 :(得分:1)

在将数据插入数组时使用相同的obj变量。

Obj是dict,它在循环中得到了更新。

我已根据您的要求更新了代码

<script>
var data = new Array();
var str = '{"msg":"success","code":"200","status":null,"data":[{"id":3663101,"lstImeis":[{"number":"14370340908558","maxDate":"2017-08-24 22:08:58.0","minDate":"2017-08-24 22:08:58.0"},{"number":"22418344742097","maxDate":"2017-08-24 18:08:56.0","minDate":"2017-08-24 18:08:56.0"}],"number2":789},{"id":3665337,"lstImeis":[{"number":"48717031235502","maxDate":"2017-08-24 21:09:38.0","minDate":"2017-08-24 21:09:38.0"},{"number":"42540009239622","maxDate":"2017-08-24 16:35:08.0","minDate":"2017-08-24 16:35:08.0"},{"number":"42540009239644","maxDate":"2017-08-24 16:35:08.0","minDate":"2017-08-24 16:35:08.0"}],"number2":456}],"draw":0,"limit":0,"recordsFiltered":0,"recordsTotal":0}';
 var response = JSON.parse(str); 
 var tableData = response.data;
var dataLength = response.data.length;

for(i = 0; i < dataLength; i++){
	
  for(a = 0; a < tableData[i].lstImeis.length; a++){
    var obj = {};
	  obj["id"] = tableData[i].id;
    obj["number"] = tableData[i].lstImeis[a].number;
    obj["maxDate"] = tableData[i].lstImeis[a].maxDate;
    obj["minDate"] = tableData[i].lstImeis[a].minDate;
    obj["number2"] = tableData[i].number2;
    data.push(obj);
   }
   
	 
}

console.log(JSON.stringify(data));

</script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

答案 2 :(得分:1)

您可以使用array#reducearray#map

var response = [{"id":3663101,"lstImeis":[{"number":"14370340908558","maxDate":"2017-08-24 22:08:58.0","minDate":"2017-08-24 22:08:58.0"},{"number":"22418344742097","maxDate":"2017-08-24 18:08:56.0","minDate":"2017-08-24 18:08:56.0"}],"number2":789},{"id":3665337,"lstImeis":[{"number":"48717031235502","maxDate":"2017-08-24 21:09:38.0","minDate":"2017-08-24 21:09:38.0"},{"number":"42540009239622","maxDate":"2017-08-24 16:35:08.0","minDate":"2017-08-24 16:35:08.0"},{"number":"42540009239644","maxDate":"2017-08-24 16:35:08.0","minDate":"2017-08-24 16:35:08.0"}],"number2":456}];

var result = response.reduce(function(res, obj) {
  var temp = obj.lstImeis.map(function(o) {
    return Object.assign({}, o, {id: obj.id, number2: obj.number2});
  });
  return res.concat(temp);
},[])

var output = {data: result};
console.log(JSON.stringify(output));

答案 3 :(得分:0)

看看这个Fiddle。您正在推送上次更新的obj数据。每次更新时都必须按下obj。

for(i = 0; i < dataLength; i++){    
  for(a = 0; a < tableData[i].lstImeis.length; a++){
    var obj = {};
    obj["id"] = tableData[i].id;
    obj["number"] = tableData[i].lstImeis[a].number;
    obj["maxDate"] = tableData[i].lstImeis[a].maxDate;
    obj["minDate"] = tableData[i].lstImeis[a].minDate;
    obj["number2"] = tableData[i].number2;
    data.push(obj);
   }      
}