2016-12-07 4 views
2

Чтобы начать, я новичок в AngularJS с некоторым знакомством с узлом/Javascript, но с программированием на 25 лет. Я поддерживаю AngularJS SPA и многому научился, однако есть некоторые вещи, которые я не совсем понимаю, и не знаю, является ли это вещь AngularJS, вещь JSON или JavaScript.JSON Array vs Объекты в AngularJS

В настоящее время данные SPA жестко закодированы в файле JSON, который загружается $http.get в файл. Теперь мне нужно создать настоящий API, который SPA будет призывать к этим данным.

Что озадачивает меня это структура закодированных данных, вот пример

{ 
    "userId": "string", 
    "firstName": "string", 
    "lastName": "string", 
    "phoneNumber": 1234567890, 
    "phoneExtention": 123, 
    "faxNumber": 1234567890, 
    "email": "[email protected]", 
    "providers": { 
    "1386664670": { 
     "firstName": "string", 
     "middleInitial": "c", 
     "lastName": "string", 
     "description": "string", 
     "location": [{ 
     "locationId": 123456789, 
     "name": "string", 
     "address": "string", 
     "city": "string", 
     "state": "string", 
     "postalCode": "string", 
     "phone": 1234567890 
     }] 
    }, 
    "1548223027": { 
     "firstName": "string", 
     "middleInitial": "c", 
     "lastName": "string", 
     "description": "string", 
     "location": [{ 
     "locationId": 123456789, 
     "name": "string", 
     "address": "string", 
     "city": "string", 
     "state": "string", 
     "postalCode": "string", 
     "phone": 1234567890 
     }, { 
     "locationId": 123456789, 
     "name": "string", 
     "address": "string", 
     "city": "string", 
     "state": "string", 
     "postalCode": "string", 
     "phone": 1234567890 
     }] 
    }, 
    "1336340579": { 
     "firstName": "string", 
     "middleInitial": "c", 
     "lastName": "string", 
     "description": "string", 
     "location": [{ 
     "locationId": 123456789, 
     "name": "string", 
     "address": "string", 
     "city": "string", 
     "state": "string", 
     "postalCode": "string", 
     "phone": 1234567890 
     }, { 
     "locationId": 123456789, 
     "name": "string", 
     "address": "string", 
     "city": "string", 
     "state": "string", 
     "postalCode": "string", 
     "phone": 1234567890 
     }] 
    } 
    } 
} 

что странно для меня является то, что providers представляет собой совокупность объектов, где ID это имя объекта , Я бы подумал, что вы хотели бы, чтобы providers быть массивом, ну, поставщиков, как это:

{ 
    "userId": "string", 
    "firstName": "string", 
    "lastName": "string", 
    "phoneNumber": 1234567890, 
    "phoneExtention": 123, 
    "faxNumber": 1234567890, 
    "email": "[email protected]", 
    "providers": [{ 
    "npi": "1386664670", 
    "firstName": "string", 
    "middleInitial": "c", 
    "lastName": "string", 
    "description": "string", 
    "location": [{ 
     "locationId": 123456789, 
     "name": "string", 
     "address": "string", 
     "city": "string", 
     "state": "string", 
     "postalCode": "string", 
     "phone": 1234567890 
    }] 
    }, { 
    "npi": "1548223027", 
    "firstName": "string", 
    "middleInitial": "c", 
    "lastName": "string", 
    "description": "string", 
    "location": [{ 
     "locationId": 123456789, 
     "name": "string", 
     "address": "string", 
     "city": "string", 
     "state": "string", 
     "postalCode": "string", 
     "phone": 1234567890 
    }, { 
     "locationId": 123456789, 
     "name": "string", 
     "address": "string", 
     "city": "string", 
     "state": "string", 
     "postalCode": "string", 
     "phone": 1234567890 
    }] 
    }, { 
    "npi": "1336340579", 
    "firstName": "string", 
    "middleInitial": "c", 
    "lastName": "string", 
    "description": "string", 
    "location": [{ 
     "locationId": 123456789, 
     "name": "string", 
     "address": "string", 
     "city": "string", 
     "state": "string", 
     "postalCode": "string", 
     "phone": 1234567890 
    }, { 
     "locationId": 123456789, 
     "name": "string", 
     "address": "string", 
     "city": "string", 
     "state": "string", 
     "postalCode": "string", 
     "phone": 1234567890 
    }] 
    }] 
} 

Оба содержат те же данные, что только доступ к другому. Я просто собирался переопределить JSON, но я подумал, что лучше понять, почему это было сделано так, как это было раньше. В HTML/AngularJS данные итерируемая над помощью:

<md-tab ng-repeat="(key, value) in vm.providerInfo"> 
    <md-tab-label> 
    {{vm.providerInfo[key].firstName}} {{vm.providerInfo[key].lastName}} 
    </md-tab-label> 

Но я думаю, что я мог бы так же легко использовать этот код:

<md-tab ng-repeat="provider in vm.providerInfo"> 
    <md-tab-label> 
    {{provider.firstName}} {{provider.lastName}} 
    </md-tab-label> 

, если я изменил структуру данных, как описано выше.

Может ли кто-нибудь указать, почему я не хочу менять структуру JSON на массив поставщиков?

+0

Не знаете, почему они решили это сделать. В этом случае я бы также использовал массив объектов, как привязанный к структуре объекта. Обычно массивы являются предпочтительным методом, поскольку они сохраняют порядок, когда объект, подобный тому, как оригинал не гарантирует, что заказ будет сохранен. Единственная причина, по которой я мог бы думать, что они будут делать это, было бы проще обратиться к провайдеру, просто указав $ obj-> providerId, чтобы найти поставщика, как вы бы сделали с картой. С массивом вам понадобится поиск массива для ключа, но на самом деле это сделать не сложно. – Gordnfreeman

+0

Я проголосовал за закрытие слишком широко, потому что есть много причин, по которым они могли бы структурировать это так. С помощью структуры объектов вы можете быстро проверить, существует ли конкретный провайдер, но у вас нет естественного порядка, поэтому вы можете сортировать его для отображения. Также вы можете легко добавлять, удалять или заменять элементы (например, сервер может отправлять вам элементы по мере их изменения, но только измененные элементы и их намного проще объединить их таким образом). – Duncan

+1

«Не знаю, является ли это вещь AngularJS, вещь JSON или вещь JavaScript». Я думаю, что это ничто из этого. Обе структуры, которые вы описываете, одинаково действительны по разным причинам, и выбор реализации данных так или иначе не будет зависеть от рассматриваемых структур. – Claies

ответ

0

Вы должны переопределить свой providers как массив JSON, если вы хотите сохранить порядок объектов, которые он содержит, т. Е. Вы хотите быть уверенным, что к объектам обращаются в том же порядке.

С providers ранее был определен как объект JSON, возможно, этот порядок не имеет значения. Также упрощается доступ как пара ключ-значение (когда вам нужно получить доступ к определенному объекту в providers). Это сводится к вашему варианту использования здесь. Соответственно, вы можете настроить свой угловой код.

2

В одном случае я могу думать о том, что для использования идентификатора в качестве ключа в объекте вместо обычного массива необходимо создать не дублирующийся массив с идентификатором в качестве уникального ключа. Это вопрос удобства, но и производительность.

Нахождение элемента в объекте по ID будет легче сделать, например:

$scope.updateProvider = function(id, data) { 
    // O(1) lookup 
    angular.merge($scope.user.providers[id], data); 
} 

В противоположность:

$scope.updateProvider = function(id, data) { 
    // this lookup might end up being very expensive, 
    // an O(n), as it loops through all the items until 
    // the condition is satisfied or the array ends 
    var providerIdx = $scope.user.providers.findIndex(i => { i.id == id }); 
    angular.merge($scope.user.providers[providerIdx], data); 
} 

Вы должны учитывать, что методы, которые я использовал, являются лишь небольшой Например, это может быть намного сложнее, и удобство + удобство поиска будет намного больше - представьте, что огромный список поставщиков, все огромные объекты и итерация через них все будет потреблять ресурсы, особенно если поставщик, которого вы ищете, isn ' t один из первых немногих.

На стороне записки, вам не нужно повторно доступа к поставщику полностью повторителя, у вас уже есть значение:

<md-tab ng-repeat="(key, value) in vm.providerInfo"> 
    <md-tab-label> 
    {{value.firstName}} {{value.lastName}} 
    </md-tab-label> 

Как для поддержания порядка, если вы не смотрите реорганизовать массив, вы можете сохранить массив идентификаторов, который уважает порядок и проходное, что:

$scope.order = [3, 2, 1]; // of course this can be dynamically generated 

и:

<md-tab ng-repeat="id in vm.order"> 
    <md-tab-label> 
    {{vm.providerInfo[id].firstName}} {{vm.providerInfo[id].lastName}} 
    </md-tab-label> 
+1

Я нашел в одном из угловых контроллеров 'angular.merge', как вы описали, и да, идентификатор провайдера является уникальным ключом в системе, поэтому это может помочь объяснить мысль/дизайн, используемый оригинальным программистом. –

+0

Звучит так :) – casraf

Смежные вопросы