从普通的jsons创建嵌套的json

时间:2017-11-16 00:36:58

标签: javascript jquery json node.js

我需要从一个节点创建一个嵌套的json对象 - mysql结果(json对象)这里是我试图完成的事情

这些是我拥有的mysql json对象:

plants: 
[{id: 1, name: 'plant 1'}, 
{id: 2, name: 'plant 2'}]

areas:
[{id: 1, nombre: 'area 1', plants_id: 1 }, 
{ id: 2, nombre: 'area 1 - plant 2', plantas_id: 2 }, 
{ id: 3, nombre: 'area n', plantas_id: 1 }]

machines:
[{id: 1, nombre: 'machine 1 - area 1', areas_id: 1 }, 
{ id: 2, nombre: 'machine 1 - area 2', areas_id: 2 },
{ id: 3, nombre: 'machine n', areas_id: 2 }]

这是我需要使用前一个json的值创建的json:

{
  "plants":[
    {
      "name":"plant 1",
      "areas": [
        { "name":"area 1", 
          "machines":[ 
            {"nombre":"machine 1 - area 1"
          }] 
        },
        { "nombre":"area 2", 
          "machines":[ 
            {"nombre":"machine 1 - area 2"
          }] 
        }
      ]
    },
    {
      "name":"plant 2",
      "areas": [
        { "nombre":"area 1 - plant 2", 
          "maquinas":[ ] 
        }
      ]
    }
  ]
}

我一直尝试使用嵌套for循环,但它很乱,我读到linq,但我从未使用过它

抱歉英文不好。任何帮助表示赞赏

谢谢和问候

1 个答案:

答案 0 :(得分:0)

这不是一种有效的解决方案,但如果您的数据集较小,则可以正常使用。

var plants = [
    { id: 1, name: 'plant 1' }, 
    { id: 2, name: 'plant 2' },
];

var areas = [
    { id: 1, nombre: 'area 1', plantas_id: 1 }, // there was a spelling mistake here
    { id: 2, nombre: 'area 1 - plant 2', plantas_id: 2 }, 
    { id: 3, nombre: 'area n', plantas_id: 1 },
];

var machines = [
    { id: 1, nombre: 'machine 1 - area 1', areas_id: 1 }, 
    { id: 2, nombre: 'machine 1 - area 2', areas_id: 2 },
    { id: 3, nombre: 'machine n', areas_id: 2 },
];

console.time('result');

function result() {
    return plants.map(function(plant) {
        return {
            "name": plant.name,
            "areas": areas.filter(function(area) {
                return area.plantas_id == plant.id;
            }).map(function(area) {
                return {
                    "nombre": area.nombre,
                    "machines": machines.filter(function(machine) {
                        return machine.areas_id == area.id;
                    }).map(function(machine) {
                        return { 
                            "nombre": machine.nombre,
                        };
                    }),
                };
            }),
        };
    });
}

console.timeEnd('result');
console.log(result());