2016-06-07 38 views
2

我只需要将多维JSON切换到单个,以提供它为js插件创建表。多维JSON到单个的

这里有响应的例子:

[ 
    { 
    "services": [], 
    "id": 1, 
    }, 
    { 
    "services": [ 
     { 
     "status": { 
      ... 
     }, 
     "name": "NAME" 
     }, 
     { 
     "status": { 
      ... 
     }, 
     "name": "NAME 2" 
     } 
    ], 
    "id": 2 
    } 
] 

我找什么:

[ 
    { 
     "services": [], 
     "id": 1, 
    }, 
    { 
     "service": {name: 'NAME', status: '' ...}, 
     "id": 2, 
    }, 
    { 
     "service": {name: 'NAME 2', status: '' ...}, 
     "id": 2, 
    } 
    ... 
] 

的想法是创建具有相同ID的条目的新阵,只有一个服务。

这里有一个循环:

function parseData(json) { 
    var newArray = []; 
    for (i = 0; i < json.length; i++){ 
     var item = json[i]; 
     if (item.services.length > 0) { 
      for (j = 0; j < item.services.length; j++){ 

       item['service'] = item.services[j]; 
       newArray.push(item); 
      } 
     } 
     else { 
      newArray.push(item); 
     } 
    } 
    return newArray; 
} 

最后,而不是用不同的单服务进入两个对象我得到两个对象具有相同的“服务”项。这个循环有什么问题?

这里的jsfiddle:https://jsfiddle.net/ghea33x1/

谢谢。

回答

0

你在这个行业

item['service'] = json[i].services[j]; 

的一个快速方法变异的对象将与Array#forEach一个循环,不变异的来源。

var data = [{ "services": [], "id": 1, }, { "services": [{ "status": {}, "name": "NAME" }, { "status": {}, "name": "NAME 2" }], "id": 2 }], 
 
    grouped = []; 
 

 
data.forEach(function (a) { 
 
    if (!a.services.length) { 
 
     grouped.push(a); 
 
     return; 
 
    } 
 
    a.services.forEach(function (b) { 
 
     grouped.push({ services: b, id: a.id }); 
 
    }); 
 
}); 
 

 
console.log(grouped);

+0

好,看起来不错,但如果JSON响应包含什么对象的属性未知数量?添加手动新属性推方法'{服务:b,id:a.id,new_property:'价值'}'我认为不是好主意。 – TheUser

+0

然后您需要遍历这些属性或使用[Object.assign](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) –

+1

Nice,just added小修正https://jsfiddle.net/ghea33x1/1/ 救命恩,btw :) – TheUser