为什么我的嵌套for循环中的代码不会被执行?

时间:2014-07-09 13:29:52

标签: javascript arrays angularjs

我有两个对象。一个有很多关于人的数据(如出生,姓名,出生地等),另一个有字母表中每个字符的数组。我的目标是通过我的人物对象中的每个人,并将人名的第一个字母与字母对象的属性进行比较。这样我就可以通过推送操作在字母对象中按字母顺序对人名进行排序。这就是我提出的。问题是,我的第二个循环中的代码只是没有被执行,我找不到问题。

angular.module('ArtistsCtrl', []).controller('ArtistsController', ['$scope', 'Artists', function ($scope, Artists) {

$scope.data = {};

$scope.tagline = 'A';

Artists.query(function (res) {
    $scope.data.artists = res;
    $scope.sortedNames = {A: [], B: [], C: [], D: [], E: [], F: [], G: [], H: [], I: [], J: [] , K: [], L: [], M: [], N: [], O: [], P: [], Q: [], R: [], S: [], T: [], U: [], V: [], W: [], X: [], Y: [], Z: []};
    var sortedNamesProperties = Object.getOwnPropertyNames($scope.sortedNames);

    (function () {
        //loop to go through my artists array
        for(var i = 0; i <= $scope.data.artists.length; i++){
            //loop to go through my sortedNames array
            for(var z = 0; z <= $scope.sortedNames.length; z++){
                if($scope.data.artists[i].displayname.charAt(0) == sortedNamesProperties[z]){
                    $scope.sortedNames[z].push($scope.data.artists[i]);
                    break;
                }
            }
        }
    })()
});

}]);

修改

感谢您发布的所有可能性。我处理obj而不是数组的提示解决了它:)我用以下方式重写了代码,尽管它们可能是一些更好,更有效的方法来处理它。但非常感谢你的帮助。特别是@Andy

angular.module('ArtistsCtrl', []).controller('ArtistsController', ['$scope', 'Artists', function ($scope, Artists) {

$scope.data = {};

$scope.tagline = 'A';

Artists.query(function (res) {
    $scope.data.artists = res;
    $scope.sortedNames = {A: [], B: [], C: [], D: [], E: [], F: [], G: [], H: [], I: [], J: [] , K: [], L: [], M: [], N: [], O: [], P: [], Q: [], R: [], S: [], T: [], U: [], V: [], W: [], X: [], Y: [], Z: []};
    var sortedNamesProperties = Object.getOwnPropertyNames($scope.sortedNames);

    (function () {
        //loop to go through my artists array
        for(var i = 0; i <= $scope.data.artists.length; i++){
            //loop to go through my sortedNames array
            for(var z = 0; z <= Object.keys($scope.sortedNames).length; z++){
                if($scope.data.artists[i].displayname.charAt(0) == sortedNamesProperties[z]){
                    $scope.sortedNames[sortedNamesProperties[z]].push($scope.data.artists[i]);
                    break;
                }
            }
        }
    })()
});

}]);

1 个答案:

答案 0 :(得分:1)

您可以将$scope.sortedNames对象的字段作为地图中的键来代替嵌套循环:

function () {
    //loop to go through my artists array
    for (var i = 0; i < $scope.data.artists.length; i++) {        
        $scope.sortedNames[$scope.data.artists[i].displayname.charAt(0)].push($scope.data.artists[i]);
    }
}

有点简化的小提琴:http://jsfiddle.net/9xeS8/1/