Search code examples
javascriptangularjsparse-platformparse-server

Nested Pointer Data


I'm calling the below Parse Query using the Parse Server Javascript API. I have a class called Device, which has a pointer object to Device_Type which in turn has a pointer to Manufacturer.

I can successfully display the deviceID in inventoryItem, but get undefined for manufacturer, despite there being the relevant data in the JSON network return.

$scope.getDeviceItems = function () {
    var query = new Parse.Query("Device");
    query.include("Device_Type");
    query.include("Device_Type.Manufacturer");
        query.find({
            success: function (results) {
                $scope.deviceItems = [];
                for (i = 0; i < results.length; i++) {
                    var d = results[i].get("Device_Type");
                    var m = results[i].get("Device_Type.Manufacturer");
                    var inventoryItem = {
                        deviceID: d.get("Device_ID"),
                        manufacturer: m.get("Manufacturer_Name")
                    }
                };
            };
        };
    };

How would I correctly obtain the nested pointer data into manufacturer?

Here's a sample JSON Object:

{
    "results": [{
        "objectId": "q3D2myHG3e",
        "createdAt": "2017-07-30T22:28:05.035Z",
        "updatedAt": "2017-09-19T20:40:05.580Z",
        "Device_Type": {
            "objectId": "Ksej3F2sdp5",
            "Device_Name": "Device 1",
            "createdAt": "2017-07-30T21:57:58.638Z",
            "updatedAt": "2017-08-08T20:20:14.397Z",
            "Manufacturer": {
                "objectId": "3NahYBNIiC",
                "Manufacturer_Name": "ABC Ltd",
                "createdAt": "2017-07-30T21:56:40.557Z",
                "updatedAt": "2017-07-30T22:13:07.425Z",
                "Devices": {
                    "__type": "Relation",
                    "className": "DeviceType"
                },
                "__type": "Object",
                "className": "DeviceManufacturer"
            },
            "__type": "Object",
            "className": "DeviceType"
        },
        ...
    }]
}

Solution

  • $scope.getDeviceItems = function () {
        var query = new Parse.Query("Device");
        query.include("Device_Type");
        query.include("Device_Type.Manufacturer");
            query.find({
                success: function (results) {
                    $scope.deviceItems = [];
                    for (i = 0; i < results.length; i++) {
                        var curResult = results[i];
                        var d = curResult.Device_Type;
                        var m = curResult.Device_Type.Manufacturer;
                        var inventoryItem = {
                            deviceID: d.Device_ID
                            manufacturer: m.Manufacturer_Name
                        }
                    };
                };
            };
        };
    

    Not sure why a map is being used a regular JS object as shown above would work easier (assuming find function just resolved with the JS object from parsing the JSON instead of turning it into a Map object)

    Using a Map you need to call get twice as far as I can tell to resolve "deeper" keys.

    $scope.getDeviceItems = function () {
        var query = new Parse.Query("Device");
        query.include("Device_Type");
        query.include("Device_Type.Manufacturer");
            query.find({
                success: function (results) {
                    $scope.deviceItems = [];
                    for (i = 0; i < results.length; i++) {
                        var curResult = results[i];
                        var d = curResult.get('Device_Type');
                        var m = curResult.get('Device_Type').get('Manufacturer'); // or d.get('Manufacturer')
                        var inventoryItem = {
                            deviceID: d.get('Device_ID')
                            manufacturer: m.get('Manufacturer_Name')
                        }
                    };
                };
            };
        };
    

    var testObj = new Map();
    testObj.set('a', new Map());
    testObj.get('a').set('b', 4);
    
    console.log(testObj.get('a').get('b'))