Cuando queremos construir un select con angular, y obtenemos el listado con un objeto o array, y tenemos los que deseamos seleccionar con otro objeto o array, con Angular, podremos construirlo solamente con una sola línea, aunque estos tengan estructuras diferentes.
Angular nos permite optimizar y reducir el código que desarrollamos con sus etiquetas ng-options y ng-model, sin tener que llegar a utilizar el ng-repeat. Cuando intentamos visualizar la etiqueta select y que nos seleccione los que deseemos, podemos encontrarnos en el problema, que los dos objetos/array tengan diferente estructuras, con los que no nos seleccione los elementos que le pasamos a través del controlador. Pero con el elemento track by, podemos indicar cual es el atributo que tengamos solamente en cuenta para saber cuales debe seleccionar. Podemos encontrar un ejemplo en la web propia de Angular, que sera en el que nos basemos para explicar como funciona.
El controlador sería:
$scope.bookList = [{
id: 1,
name: 'home'
}, {
id: 2,
name: 'house'
}];
$scope.books = { name: 'house' };
Esto sería el HTML:
Donde podemos ver que bookList sería el listado completo de option que se van a mostrar, y books, es el listado de los seleccionados. Tendríamos en cuenta book.name, que sería el elemento que tendríamos en cuenta para los seleccionados.