访问唯一的嵌套JSON数组项

时间:2018-11-14 21:16:23

标签: javascript json

我试图深入研究以下数组,以在解析完所有连接器类型项后将其变为选择选项。

目前,我可以获取所需的所有数据,但我想将返回的每个项目转换为单个字符串,而不是让它返回具有多个连接器类型的项目作为单个项目(在下面)该示例显示了我当前拥有的/期望,并且仅显示了唯一的类型,因此,如果连接器名称已显示一次,则不要再次显示该名称作为选择。

例如(当前输出):

(显示重复项,嵌套类型不止一种的项目不会分解成一行)

ConnectorType1
ConnectorType1, ConnectorType2, ConnectorType3
ConnectorType1
ConnectorType1, ConnectorType2

所需的输出:

(仅显示唯一项,所有结果都换行)

ConnectorType1,
ConnectorType2,
ConnectorType3

带有JSON示例的astebin:

{
    "ChargeDevice": [
        {
            "ChargeDeviceId": "cfeedcdd5e287bef4b583158a12363f1",
            "ChargeDeviceRef": "SRC_LDN60188",
            "ChargeDeviceName": "2 Riddons Road",
            "ChargeDeviceText": null,
            "ChargeDeviceLocation": {
                "Latitude": "51.431454",
                "Longitude": "0.031175",
                "Address": {
                    "SubBuildingName": null,
                    "BuildingName": "",
                    "BuildingNumber": "",
                    "Thoroughfare": "Riddons Road",
                    "Street": "Junction with Chinbrook Road",
                    "DoubleDependantLocality": null,
                    "DependantLocality": null,
                    "PostTown": "Leek",
                    "County": "Greater London",
                    "PostCode": "SE12 9QR",
                    "Country": "gb",
                    "UPRN": null
                },
                "LocationShortDescription": null,
                "LocationLongDescription": ""
            },
            "ChargeDeviceManufacturer": null,
            "ChargeDeviceModel": null,
            "PublishStatusID": "1",
            "DateCreated": "2014-08-19 05:15:02",
            "DateUpdated": "2015-09-02 11:28:16",
            "Attribution": "Source London",
            "DateDeleted": "n/a",
            "Connector": [
                {
                    "ConnectorId": "1",
                    "ConnectorType": "3-pin Type G (BS1363)",
                    "RatedOutputkW": "3.7",
                    "RatedOutputVoltage": "230",
                    "RatedOutputCurrent": "16",
                    "ChargeMethod": "Single Phase AC",
                    "ChargeMode": "1",
                    "ChargePointStatus": "In service",
                    "TetheredCable": "0",
                    "Information": "  x 3-pin square (BS 1363) - Standard (up to 3.7kW, 13-16A)",
                    "Validated": "0"
                },
                {
                    "ConnectorId": "2",
                    "ConnectorType": "Type 2 Mennekes (IEC62196)",
                    "RatedOutputkW": "7.0",
                    "RatedOutputVoltage": "230",
                    "RatedOutputCurrent": "32",
                    "ChargeMethod": "Single Phase AC",
                    "ChargeMode": "3",
                    "ChargePointStatus": "In service",
                    "TetheredCable": "0",
                    "Information": "  x 7-pin 'Smart' eg Mennekes (IEC 62196) - Fast (7kW, 32A)",
                    "Validated": "0"
                }
            ],
            "DeviceOwner": {
                "OrganisationName": "Source London",
                "SchemeCode": "SRC_LDN",
                "Website": "https://www.sourcelondon.net",
                "TelephoneNo": "020 3056 8989"
            },
            "DeviceController": {
                "OrganisationName": "Source London",
                "SchemeCode": "SRC_LDN",
                "Website": "https://www.sourcelondon.net",
                "TelephoneNo": "020 3056 8989"
            },
            "DeviceAccess": [],
            "DeviceNetworks": "Source London",
            "ChargeDeviceStatus": "In service",
            "PublishStatus": "Published",
            "DeviceValidated": "0",
            "RecordModerated": "Y",
            "RecordLastUpdated": "2015-09-02 11:28:16",
            "RecordLastUpdatedBy": "NCR Admin",
            "PaymentRequiredFlag": false,
            "PaymentDetails": "",
            "SubscriptionRequiredFlag": true,
            "SubscriptionDetails": "\u00a35 per annum for RFiD card",
            "ParkingFeesFlag": false,
            "ParkingFeesDetails": "",
            "ParkingFeesUrl": null,
            "AccessRestrictionFlag": false,
            "AccessRestrictionDetails": "",
            "PhysicalRestrictionFlag": false,
            "PhysicalRestrictionText": "",
            "OnStreetFlag": true,
            "LocationType": "On-street",
            "Bearing": null,
            "Accessible24Hours": false
        }
    ]
}

用于遍历JSON的当前代码:

for (let x = 0; x < data.ChargeDevice[i].Connector.length; x++) {
          if (connectors.indexOf(data.ChargeDevice[i].Connector[x].ConnectorType) === -1) {
            connectors.push(data.ChargeDevice[i].Connector[x].ConnectorType);
            $('#connectorList').append(`<option data-loc-name="${connectors}" value="${connectors}">${connectors}</option>`);
          }
        }

3 个答案:

答案 0 :(得分:1)

您可以拿Set来检查项目是否不在集合中,然后使用该项目并将其添加到集合中。

var array = [{ connector: ['ConnectorType1'] }, { connector: ['ConnectorType1', 'ConnectorType2', 'ConnectorType3'] }, { connector: ['ConnectorType1'] }, { connector: ['ConnectorType1', 'ConnectorType2'] }],
    connectors = new Set;

array.forEach(({ connector }) => connector.forEach(c => {
    if (connectors.has(c)) return;
    console.log(c);
    connectors.add(c);
}));

答案 1 :(得分:1)

我建议您遍历与Array.from(myJson.ChargeDevice[0].Connector, ...的所有连接。

然后对于每个连接,将push的值.ConnectorType放入数组(myConnArr)(如果尚不存在)。像这样if(!myConnArr.includes(conn.ConnectorType)) myConnArr.push(conn.ConnectorType)

最后,我join保留所有结果,并像.join(", \n")这样将它们分开。

完整代码段。出于测试目的,我复制了一些连接器值以显示remove_duplicates()正常。

let myJson = {
    "ChargeDevice": [
        {
            "ChargeDeviceId": "cfeedcdd5e287bef4b583158a12363f1",
            "ChargeDeviceRef": "SRC_LDN60188",
            "ChargeDeviceName": "2 Riddons Road",
            "ChargeDeviceText": null,
            "ChargeDeviceLocation": {
                "Latitude": "51.431454",
                "Longitude": "0.031175",
                "Address": {
                    "SubBuildingName": null,
                    "BuildingName": "",
                    "BuildingNumber": "",
                    "Thoroughfare": "Riddons Road",
                    "Street": "Junction with Chinbrook Road",
                    "DoubleDependantLocality": null,
                    "DependantLocality": null,
                    "PostTown": "Leek",
                    "County": "Greater London",
                    "PostCode": "SE12 9QR",
                    "Country": "gb",
                    "UPRN": null
                },
                "LocationShortDescription": null,
                "LocationLongDescription": ""
            },
            "ChargeDeviceManufacturer": null,
            "ChargeDeviceModel": null,
            "PublishStatusID": "1",
            "DateCreated": "2014-08-19 05:15:02",
            "DateUpdated": "2015-09-02 11:28:16",
            "Attribution": "Source London",
            "DateDeleted": "n/a",
            "Connector": [
                {
                    "ConnectorId": "1",
                    "ConnectorType": "3-pin Type G (BS1363)",
                    "RatedOutputkW": "3.7",
                    "RatedOutputVoltage": "230",
                    "RatedOutputCurrent": "16",
                    "ChargeMethod": "Single Phase AC",
                    "ChargeMode": "1",
                    "ChargePointStatus": "In service",
                    "TetheredCable": "0",
                    "Information": "  x 3-pin square (BS 1363) - Standard (up to 3.7kW, 13-16A)",
                    "Validated": "0"
                },
                {
                    "ConnectorId": "1",
                    "ConnectorType": "3-pin Type G (BS1363)",
                    "RatedOutputkW": "3.7",
                    "RatedOutputVoltage": "230",
                    "RatedOutputCurrent": "16",
                    "ChargeMethod": "Single Phase AC",
                    "ChargeMode": "1",
                    "ChargePointStatus": "In service",
                    "TetheredCable": "0",
                    "Information": "  x 3-pin square (BS 1363) - Standard (up to 3.7kW, 13-16A)",
                    "Validated": "0"
                },
                {
                    "ConnectorId": "2",
                    "ConnectorType": "Type 2 Mennekes (IEC62196)",
                    "RatedOutputkW": "7.0",
                    "RatedOutputVoltage": "230",
                    "RatedOutputCurrent": "32",
                    "ChargeMethod": "Single Phase AC",
                    "ChargeMode": "3",
                    "ChargePointStatus": "In service",
                    "TetheredCable": "0",
                    "Information": "  x 7-pin 'Smart' eg Mennekes (IEC 62196) - Fast (7kW, 32A)",
                    "Validated": "0"
                }
            ],
            "DeviceOwner": {
                "OrganisationName": "Source London",
                "SchemeCode": "SRC_LDN",
                "Website": "https://www.sourcelondon.net",
                "TelephoneNo": "020 3056 8989"
            },
            "DeviceController": {
                "OrganisationName": "Source London",
                "SchemeCode": "SRC_LDN",
                "Website": "https://www.sourcelondon.net",
                "TelephoneNo": "020 3056 8989"
            },
            "DeviceAccess": [],
            "DeviceNetworks": "Source London",
            "ChargeDeviceStatus": "In service",
            "PublishStatus": "Published",
            "DeviceValidated": "0",
            "RecordModerated": "Y",
            "RecordLastUpdated": "2015-09-02 11:28:16",
            "RecordLastUpdatedBy": "NCR Admin",
            "PaymentRequiredFlag": false,
            "PaymentDetails": "",
            "SubscriptionRequiredFlag": true,
            "SubscriptionDetails": "\u00a35 per annum for RFiD card",
            "ParkingFeesFlag": false,
            "ParkingFeesDetails": "",
            "ParkingFeesUrl": null,
            "AccessRestrictionFlag": false,
            "AccessRestrictionDetails": "",
            "PhysicalRestrictionFlag": false,
            "PhysicalRestrictionText": "",
            "OnStreetFlag": true,
            "LocationType": "On-street",
            "Bearing": null,
            "Accessible24Hours": false
        }
    ]
};

let myConnArr = [];
Array.from(myJson.ChargeDevice[0].Connector, conn =>
{
  if(!myConnArr.includes(conn.ConnectorType)) myConnArr.push(conn.ConnectorType)
});
console.log(myConnArr.join(", \n"));

答案 2 :(得分:0)

不确定这是您要执行的操作,但是这里有一个函数可以返回ChargeDevice和一些测试中的唯一连接器数组。

function getUniqueConnectors(data) {
        var connectors = [];
        for (let i in data.ChargeDevice) {
            for (let x = 0; x < data.ChargeDevice[i].Connector.length; x++) {
                if (connectors.indexOf(data.ChargeDevice[i].Connector[x].ConnectorType) === -1) {
                    connectors.push(data.ChargeDevice[i].Connector[x].ConnectorType);
                }
            }
        }
        return connectors;
    }

    var objectOne = {
        "ChargeDevice": [
            {
                "ChargeDeviceId": "cfeedcdd5e287bef4b583158a12363f1",
                "ChargeDeviceRef": "SRC_LDN60188",
                "ChargeDeviceName": "2 Riddons Road",
                "ChargeDeviceText": null,
                "ChargeDeviceLocation": {
                    "Latitude": "51.431454",
                    "Longitude": "0.031175",
                    "Address": {
                        "SubBuildingName": null,
                        "BuildingName": "",
                        "BuildingNumber": "",
                        "Thoroughfare": "Riddons Road",
                        "Street": "Junction with Chinbrook Road",
                        "DoubleDependantLocality": null,
                        "DependantLocality": null,
                        "PostTown": "Leek",
                        "County": "Greater London",
                        "PostCode": "SE12 9QR",
                        "Country": "gb",
                        "UPRN": null
                    },
                    "LocationShortDescription": null,
                    "LocationLongDescription": ""
                },
                "ChargeDeviceManufacturer": null,
                "ChargeDeviceModel": null,
                "PublishStatusID": "1",
                "DateCreated": "2014-08-19 05:15:02",
                "DateUpdated": "2015-09-02 11:28:16",
                "Attribution": "Source London",
                "DateDeleted": "n/a",
                "Connector": [
                    {
                        "ConnectorId": "1",
                        "ConnectorType": "3-pin Type G (BS1363)",
                        "RatedOutputkW": "3.7",
                        "RatedOutputVoltage": "230",
                        "RatedOutputCurrent": "16",
                        "ChargeMethod": "Single Phase AC",
                        "ChargeMode": "1",
                        "ChargePointStatus": "In service",
                        "TetheredCable": "0",
                        "Information": "  x 3-pin square (BS 1363) - Standard (up to 3.7kW, 13-16A)",
                        "Validated": "0"
                    },
                    {
                        "ConnectorId": "2",
                        "ConnectorType": "Type 2 Mennekes (IEC62196)",
                        "RatedOutputkW": "7.0",
                        "RatedOutputVoltage": "230",
                        "RatedOutputCurrent": "32",
                        "ChargeMethod": "Single Phase AC",
                        "ChargeMode": "3",
                        "ChargePointStatus": "In service",
                        "TetheredCable": "0",
                        "Information": "  x 7-pin 'Smart' eg Mennekes (IEC 62196) - Fast (7kW, 32A)",
                        "Validated": "0"
                    },
                    {
                        "ConnectorId": "2",
                        "ConnectorType": "Type 2 Mennekes (IEC62196)",
                        "RatedOutputkW": "7.0",
                        "RatedOutputVoltage": "230",
                        "RatedOutputCurrent": "32",
                        "ChargeMethod": "Single Phase AC",
                        "ChargeMode": "3",
                        "ChargePointStatus": "In service",
                        "TetheredCable": "0",
                        "Information": "  x 7-pin 'Smart' eg Mennekes (IEC 62196) - Fast (7kW, 32A)",
                        "Validated": "0"
                    },
                    {
                        "ConnectorId": "2",
                        "ConnectorType": "Type 2 Mennekes (IEC62196)",
                        "RatedOutputkW": "7.0",
                        "RatedOutputVoltage": "230",
                        "RatedOutputCurrent": "32",
                        "ChargeMethod": "Single Phase AC",
                        "ChargeMode": "3",
                        "ChargePointStatus": "In service",
                        "TetheredCable": "0",
                        "Information": "  x 7-pin 'Smart' eg Mennekes (IEC 62196) - Fast (7kW, 32A)",
                        "Validated": "0"
                    },
                ],
                "DeviceOwner": {
                    "OrganisationName": "Source London",
                    "SchemeCode": "SRC_LDN",
                    "Website": "https://www.sourcelondon.net",
                    "TelephoneNo": "020 3056 8989"
                },
                "DeviceController": {
                    "OrganisationName": "Source London",
                    "SchemeCode": "SRC_LDN",
                    "Website": "https://www.sourcelondon.net",
                    "TelephoneNo": "020 3056 8989"
                },
                "DeviceAccess": [],
                "DeviceNetworks": "Source London",
                "ChargeDeviceStatus": "In service",
                "PublishStatus": "Published",
                "DeviceValidated": "0",
                "RecordModerated": "Y",
                "RecordLastUpdated": "2015-09-02 11:28:16",
                "RecordLastUpdatedBy": "NCR Admin",
                "PaymentRequiredFlag": false,
                "PaymentDetails": "",
                "SubscriptionRequiredFlag": true,
                "SubscriptionDetails": "\u00a35 per annum for RFiD card",
                "ParkingFeesFlag": false,
                "ParkingFeesDetails": "",
                "ParkingFeesUrl": null,
                "AccessRestrictionFlag": false,
                "AccessRestrictionDetails": "",
                "PhysicalRestrictionFlag": false,
                "PhysicalRestrictionText": "",
                "OnStreetFlag": true,
                "LocationType": "On-street",
                "Bearing": null,
                "Accessible24Hours": false
            },
        ]
    };

    console.log(getUniqueConnectors(objectOne)); //["3-pin Type G (BS1363)", "Type 2 Mennekes (IEC62196)"]