将子JSON对象移动到父ID为

时间:2017-08-22 16:15:16

标签: javascript sql-server json node.js npm

我是JavaScript新手,我正在使用Node.JS来访问API并将响应存储在SQL Server中。我正在使用“请求”和“mssql”节点包。我并不依赖于这些,它们似乎就是我所需要的,并且拥有良好的文档和支持。

我的问题:我从API获得了以下格式的JSON响应:

requests = [ { 
  url: 'https://domain.zendesk.com/api/v2/requests/2.json',
  id: 2,
  status: 'closed',
  priority: 'normal',
  type: 'incident',
  subject: 'Test Ticket',
  description: 'Test ticket',
  organization_id: 10101010101,
  via: { 
    channel: 'email',
    source: { 
      from: { 
        address: 'bill.bob@domain.com',
        name: 'Bill Bob' 
      },
      to: { 
        name: 'Company Helpdesk',
        address: 'testzendesk@domain.com' 
      },
      rel: null 
    },
  },
  custom_fields:[ 
    { id: 31368658, value: null },
    { id: 29221487, value: null },
    { id: 31636418, value: null },
    { id: 29498078, value: null },
    { id: 31659217, value: null } 
  ],
  requester_id: 2020202020,
  collaborator_ids: [],
  is_public: true,
  due_at: null,
  can_be_solved_by_me: false,
  created_at: '2015-03-05T05:55:22Z',
  updated_at: '2015-03-12T05:01:51Z',
  recipient: 'testzendesk@domain.com',
  followup_source_id: null,
  assignee_id: 30303030303,
  ticket_form_id: null,
  fields: [ 
    { id: 31368658, value: null },
    { id: 29221487, value: null },
    { id: 31636418, value: null },
    { id: 29498078, value: null },
    { id: 31659217, value: null } 
  ] 
},
{ 
  url: 'https://domain.zendesk.com/api/v2/requests/2.json',
  id: 3,
  status: 'closed',
  priority: 'normal',
  type: 'incident',
  subject: 'Test Ticket',
  description: 'Test ticket',
  organization_id: 10101010101,
  via: { 
    channel: 'email',
    source: { 
      from: { 
        address: 'bill.bob@domain.com',
        name: 'Bill Bob' 
      },
      to: { 
        name: 'Company Helpdesk',
        address: 'testzendesk@domain.com' 
      },
      rel: null 
    }
  },
  custom_fields: [ 
    { id: 31368658, value: null },
    { id: 29221487, value: null },
    { id: 31636418, value: null },
    { id: 29498078, value: null },
    { id: 31659217, value: null } 
  ],
  requester_id: 2020202020,
  collaborator_ids: [],
  is_public: true,
  due_at: null,
  can_be_solved_by_me: false,
  created_at: '2015-03-05T05:55:22Z',
  updated_at: '2015-03-12T05:01:51Z',
  recipient: 'testzendesk@domain.com',
  followup_source_id: null,
  assignee_id: 30303030303,
  ticket_form_id: null,
  fields: [ 
    { id: 31368658, value: null },
    { id: 29221487, value: null },
    { id: 31636418, value: null },
    { id: 29498078, value: null },
    { id: 31659217, value: null } 
  ] 
} ];

我需要将子对象拉出来,即带有父ID的“via”,“custom_fields”和“fields”。因此,对于第一个对象,每个“via”子对象也将具有ID 2,并且将具有“channel”,“source”和“ID”元素。

这样的事情:

父母:

[   
    { 
        url: 'https://domain.zendesk.com/api/v2/requests/2.json',
        id: 2,
        status: 'closed',
        priority: 'normal',
        type: 'incident',
        subject: 'Test Ticket',
        description: 'Test ticket',
        organization_id: 10101010101,
        requester_id: 2020202020,
        collaborator_ids: [],
        is_public: true,
        due_at: null,
        can_be_solved_by_me: false,
        created_at: '2015-03-05T05:55:22Z',
        updated_at: '2015-03-12T05:01:51Z',
        recipient: 'testzendesk@domain.com',
        followup_source_id: null,
        assignee_id: 30303030303,
        ticket_form_id: null
    },
    { url: 'https://domain.zendesk.com/api/v2/requests/2.json',
        id: 3,
        status: 'closed',
        priority: 'normal',
        type: 'incident',
        subject: 'Test Ticket',
        description: 'Test ticket',
        organization_id: 10101010101,
        requester_id: 2020202020,
        collaborator_ids: [],
        is_public: true,
        due_at: null,
        can_be_solved_by_me: false,
        created_at: '2015-03-05T05:55:22Z',
        updated_at: '2015-03-12T05:01:51Z',
        recipient: 'testzendesk@domain.com',
        followup_source_id: null,
        assignee_id: 30303030303,
        ticket_form_id: null 
    }
]

通过:

[
    { 
        channel: 'email',
        parent_id: 2
    },
    {
        channel: 'email',
        parent_id: 3
    }
]

via_source_from:

[
    {
        address: 'bill.bob@domain.com',
        name: 'Bill Bob',
        parent_id: 2
    },
    {
        address: 'bill.bob@domain.com',
        name: 'Bill Bob',
        parent_id: 2
    }
]

via_source_to:

[
    {
        name: 'Company Helpdesk',
        address: 'testzendesk@domain.com',
        parent_id: 2
    },
    {
        name: 'Company Helpdesk',
        address: 'testzendesk@domain.com',
        parent_id: 2
    }
]

custom_fields:

[
    { parent_id: 2, id: 31368658, value: null },
    { parent_id: 2, id: 29221487, value: null },
    { parent_id: 2, id: 31636418, value: null },
    { parent_id: 2, id: 29498078, value: null },
    { parent_id: 2, id: 31659217, value: null },
    { parent_id: 3, id: 31368658, value: null },
    { parent_id: 3, id: 29221487, value: null },
    { parent_id: 3, id: 31636418, value: null },
    { parent_id: 3, id: 29498078, value: null },
    { parent_id: 3, id: 31659217, value: null } 
]

字段:

[
    { parent_id: 2, id: 31368658, value: null },
    { parent_id: 2, id: 29221487, value: null },
    { parent_id: 2, id: 31636418, value: null },
    { parent_id: 2, id: 29498078, value: null },
    { parent_id: 2, id: 31659217, value: null },
    { parent_id: 3, id: 31368658, value: null },
    { parent_id: 3, id: 29221487, value: null },
    { parent_id: 3, id: 31636418, value: null },
    { parent_id: 3, id: 29498078, value: null },
    { parent_id: 3, id: 31659217, value: null }
]

我已经四处寻找,但没有找到任何可以让我这样做的东西。

非常感谢!

1 个答案:

答案 0 :(得分:0)

你可以做这样的事情,没有太多要描述但仍然无法理解下面的代码,请发表评论。

我还没有操纵parents对象,但您可以自己删除所需的字段。你可以参考this link。但请记住在克隆对象后进行操作,因为delete运算符会改变原始对象。

let
parents = [],
via = [],
via_source_from = [],
via_source_to = [],
custom_fields = [],
fields = [];

requests.forEach( record => {

  let pid = record.id;

  parents = [ ...parents, record ];

  via = [ ...via, Object.assign({}, { parent_id: pid, channel: record.via.channel } ) ];

  via_source_from = [ ...via_source_from, Object.assign({}, { parent_id: pid }, record.via.source.from ) ]

  via_source_to = [ ...via_source_to, Object.assign({}, { parent_id: pid }, record.via.source.to ) ]

  custom_fields = [ ...custom_fields, ...record.custom_fields.map( f => { return Object.assign({}, f, { parent_id: pid }) } ) ]

  fields = [ ...fields, ...record.fields.map( f => { return Object.assign({}, f, { parent_id: pid }) } ) ]

});


console.log("parent: ", parent);
console.log("via: ", via);
console.log("via_source_from: ", via_source_from);
console.log("via_source_to: ", via_source_to);
console.log("custom_fields: ", custom_fields);
console.log("fields: ", fields);

更新

我刚刚在开始时创建了一个空数组,以便在requests的每次迭代中添加特定数据。然后使用下面给出的四个概念将数组与相关数据连接起来。

传播运营商

var arr1 = [0, 1, 2];
var arr2 = [3, 4, 5];
var arr3 = [...arr1, ...arr2]; // returns new array [0, 1, 2, 3, 4, 5]
var arr4 = [...arr3, 6]; // returns new array [0, 1, 2, 3, 4, 5, 6]

这是javascript的新传播运算符。您可以参考this link以获得更好的理解。对于数组,它与array.concat的工作方式相同,只是更清晰的语法。

对象分配

  

Object.assign()方法用于将所有可枚举的自有属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。

var obj = { a: 1 };
var copy = Object.assign({}, obj, { b: 2 }); // we can add as many object as we need.
copy.c = 3;
console.log(obj); // { a: 1 }
console.log(copy); // { a: 1, b: 2, c: 3 }

克隆对象而不引用原始对象的好方法。总之,要创建不可变对象。您可以参考this link以获得更好的理解。

Array.prototype.map()

  

map()方法创建一个新数组,其结果是在调用数组中的每个元素上调用提供的函数。

var numbers = [1, 5, 10, 15];
var doubles = numbers.map(function(x) {
    return x * 2;
});
// doubles is now [2, 10, 20, 30]
// numbers is still [1, 5, 10, 15]

请记住,它返回一个新数组并且不会影响原始数组。你必须从内部函数返回一些东西,你将在最终数组中的那个索引处有undefined。您可以参考this link以获得更好的理解。

箭头功能

  

箭头函数表达式的语法短于函数表达式,并且不绑定它自己的this,arguments,super或new.target。

[ 'hi', 'ola', 'hello' ].map( greet => greet.length );
// returns [ 2, 3, 5 ]

编写函数的语法较短。一个要点是,与this关键字不同,它不绑定自己的function,它确实有助于定义this的范围。您可以参考this link以获得更好的理解。