将 Json 数组嵌套到对象

时间:2021-04-26 10:57:00

标签: javascript jquery arrays json object

我们正在开发一个集成工具,它在 JSON 下生成,它创建一个对象数组而不是对象,我们的最终应用程序不支持这种数组结构,我们无法在集成工具中更改结构,但是我们可以添加可以执行此操作的javascript。我添加了当前和预期的 JSON 有效负载。 dataReq 段内的括号需要提前删除谢谢!

当前的 Json:

{
    "abc": [
        {
            "abcId": "1",
            "dataReq": [
                {
                    "url": "/api.css.com",
                    "body": {
                        "desc": "Sprint",
                        "na": "Customer Data",
                        "tzone": "America/Los_Angeles"
                    },
                    "method": "PATCH",
                    "refData": "OP"
                },
                [
                    {
                        "url": "/api.css.com/v1",
                        "body": {
                            "day": "Monday",
                            "end": "18:00:00.000Z",
                            "start": "08:00:00.000Z",
                            "hours": "08",
                            "Type": "Normal"
                        },
                        "method": "PATCH",
                        "refData": "timeslotN"
                    },
                    {
                        "url": "/api.css.com/v2",
                        "body": {
                            "DayOfWeek": "Tuesday",
                            "EndTime": "18:00:00.000Z",
                            "StartTime": "08:00:00.000Z",
                            "hours": "09",
                            "Type": "Normal"
                        },
                        "method": "PATCH",
                        "refData": "timeslotN"
                    }
                ],
                {
                    "url": "/api.css.com/v3",
                    "body": {
                        "Name": "Spirit2",
                        "Type": "murchast",
                        "Parent": {
                            "accID": "2"
                        },
                        "street": "CR Steet",
                        "city": "NYK",
                        "state": null,
                        "postal": "9020",
                        "state": null,
                        "country": "LZ",
                    },
                    "method": "PATCH",
                    "refData": "Account"
                },
                {
                    "url": "/api.css.com/v4",
                    "body": {
                        "account": "12321",
                        "state": {
                            "statecode": "311"
                        }
                    },
                    "method": "PATCH",
                    "refData": "acst"
                }
            ]
        }
    ]
}

预期的 JSON:

{
    "abc": [
        {
            "abcId": "1",
            "dataReq": [
                {
                    "url": "/api.css.com",
                    "body": {
                        "desc": "Sprint",
                        "na": "Customer Data",
                        "tzone": "America/Los_Angeles"
                    },
                    "method": "PATCH",
                    "refData": "OP"
                },
                {
                        "url": "/api.css.com/v1",
                        "body": {
                            "day": "Monday",
                            "end": "18:00:00.000Z",
                            "start": "08:00:00.000Z",
                            "hours": "08",
                            "Type": "Normal"
                        },
                        "method": "PATCH",
                        "refData": "timeslotN"
                    },
                    {
                        "url": "/api.css.com/v2",
                        "body": {
                            "DayOfWeek": "Tuesday",
                            "EndTime": "18:00:00.000Z",
                            "StartTime": "08:00:00.000Z",
                            "hours": "09",
                            "Type": "Normal"
                        },
                        "method": "PATCH",
                        "refData": "timeslotN"
                    },
                {
                    "url": "/api.css.com/v3",
                    "body": {
                        "Name": "Spirit2",
                        "Type": "murchast",
                        "Parent": {
                            "accID": "2"
                        },
                        "street": "CR Steet",
                        "city": "NYK",
                        "state": null,
                        "postal": "9020",
                        "state": null,
                        "country": "LZ",
                    },
                    "method": "PATCH",
                    "refData": "Account"
                },
                {
                    "url": "/api.css.com/v4",
                    "body": {
                        "account": "12321",
                        "state": {
                            "statecode": "311"
                        }
                    },
                    "method": "PATCH",
                    "refData": "acst"
                }
            ]
        }
    ]
}

2 个答案:

答案 0 :(得分:2)

尝试使用 Array#flatMap

您可以简单地使用 Array#flatMap 来展平 dataReq 数组。

<块引用>

data.abc[0].dataReq = data.abc[0].dataReq.flatMap((d) => d);

const data={abc:[{abcId:"1",dataReq:[{url:"/api.css.com",body:{desc:"Sprint",na:"Customer Data",tzone:"America/Los_Angeles"},method:"PATCH",refData:"OP"},[{url:"/api.css.com/v1",body:{day:"Monday",end:"18:00:00.000Z",start:"08:00:00.000Z",hours:"08",Type:"Normal"},method:"PATCH",refData:"timeslotN"},{url:"/api.css.com/v2",body:{DayOfWeek:"Tuesday",EndTime:"18:00:00.000Z",StartTime:"08:00:00.000Z",hours:"09",Type:"Normal"},method:"PATCH",refData:"timeslotN"}],{url:"/api.css.com/v3",body:{Name:"Spirit2",Type:"murchast",Parent:{accID:"2"},street:"CR Steet",city:"NYK",state:null,postal:"9020",state:null,country:"LZ"},method:"PATCH",refData:"Account"},{url:"/api.css.com/v4",body:{account:"12321",state:{statecode:"311"}},method:"PATCH",refData:"acst"}]}]};

data.abc[0].dataReq = data.abc[0].dataReq.flatMap((d) => d);

console.log(JSON.stringify(data))

答案 1 :(得分:0)

这是使用 object-scan 的通用解决方案。

此解决方案会将双嵌套数组上拉一层。

// const objectScan = require('object-scan');

const data1 = { abc: [ { abcId: '1', dataReq: [ { url: '/api.css.com', body: { desc: 'Sprint', na: 'Customer Data', tzone: 'America/Los_Angeles' }, method: 'PATCH', refData: 'OP' }, [ { url: '/api.css.com/v1', body: { day: 'Monday', end: '18:00:00.000Z', start: '08:00:00.000Z', hours: '08', Type: 'Normal' }, method: 'PATCH', refData: 'timeslotN' }, { url: '/api.css.com/v2', body: { DayOfWeek: 'Tuesday', EndTime: '18:00:00.000Z', StartTime: '08:00:00.000Z', hours: '09', Type: 'Normal' }, method: 'PATCH', refData: 'timeslotN' } ], { url: '/api.css.com/v3', body: { Name: 'Spirit2', Type: 'murchast', Parent: { accID: '2' }, street: 'CR Steet', city: 'NYK', state: null, postal: '9020', state: null, country: 'LZ' }, method: 'PATCH', refData: 'Account' }, { url: '/api.css.com/v4', body: { account: '12321', state: { statecode: '311' } }, method: 'PATCH', refData: 'acst' } ] } ] };

const modify = objectScan(['**.*[*][*]'], {
  rtn: 'count',
  filterFn: ({ parent, gparent, property, gproperty }) => {
    gparent.splice(gproperty + 1, 0, parent[property]);
    parent.splice(property, 1);
    if (parent.length === 0) {
      gparent.splice(gproperty, 1);
    }
  }
});

console.log(modify(data1));
// => 2

console.log(data1);
// => { abc: [ { abcId: '1', dataReq: [ { url: '/api.css.com', body: { desc: 'Sprint', na: 'Customer Data', tzone: 'America/Los_Angeles' }, method: 'PATCH', refData: 'OP' }, { url: '/api.css.com/v1', body: { day: 'Monday', end: '18:00:00.000Z', start: '08:00:00.000Z', hours: '08', Type: 'Normal' }, method: 'PATCH', refData: 'timeslotN' }, { url: '/api.css.com/v2', body: { DayOfWeek: 'Tuesday', EndTime: '18:00:00.000Z', StartTime: '08:00:00.000Z', hours: '09', Type: 'Normal' }, method: 'PATCH', refData: 'timeslotN' }, { url: '/api.css.com/v3', body: { Name: 'Spirit2', Type: 'murchast', Parent: { accID: '2' }, street: 'CR Steet', city: 'NYK', state: null, postal: '9020', country: 'LZ' }, method: 'PATCH', refData: 'Account' }, { url: '/api.css.com/v4', body: { account: '12321', state: { statecode: '311' } }, method: 'PATCH', refData: 'acst' } ] } ] }
.as-console-wrapper {max-height: 100% !important; top: 0}
<script src="https://bundle.run/object-scan@15.0.0"></script>

免责声明:我是object-scan

的作者

这是一个例子,可以更清楚地说明正在发生的事情

// const objectScan = require('object-scan');

const data2 = { a: { b: [[1, [2, 3]], { c: 4 }] }, d: [{ e: 5 }, 6, [7, 8]] };

const modify = objectScan(['**.*[*][*]'], {
  rtn: 'count',
  filterFn: ({ parent, gparent, property, gproperty }) => {
    gparent.splice(gproperty + 1, 0, parent[property]);
    parent.splice(property, 1);
    if (parent.length === 0) {
      gparent.splice(gproperty, 1);
    }
  }
});

console.log(modify(data2));
// => 4

console.log(data2);
// => { a: { b: [ 1, [ 2, 3 ], { c: 4 } ] }, d: [ { e: 5 }, 6, 7, 8 ] }
.as-console-wrapper {max-height: 100% !important; top: 0}
<script src="https://bundle.run/object-scan@15.0.0"></script>

免责声明:我是object-scan

的作者
相关问题