在angular(循环中的循环)中创建新的对象数组时遇到麻烦

Having trouble creating a new array of objects in angular (loop inside of loop)

本文关键字:循环 数组 麻烦 遇到 对象 angular 创建      更新时间:2023-09-26

我想做的是比较两个数组"similarBands"answers"artistsArray"。我想记录两个数组中出现的每一个匹配(这是我创建计数器背后的逻辑)。我要寻找的最终结果是一个新的对象数组(称为newMatchingArray),其中包含这两个数组的所有匹配项,它将接受一个name属性和一个matches属性(表示有多少个匹配项)。

函数现在正确地找到匹配,但不会在每次匹配时增加"计数器",它停止在2。我对JS和AJAX完全陌生,所以很抱歉有明显的问题/缺乏技术细节。谢谢!

  $scope.getBandsLikeThisBand = function(){
          $.ajax({
            async: false,
            type: 'Get',
            url: 'https://api.spotify.com/v1/artists/' + $scope.bandId + '/related-artists',
            success: function(data){
              console.log($scope.allTheArtists);
              $scope.similarBandsArray = data.artists;
              $scope.similarMathesArray = [];
              $scope.newMatchingArray = [];
                for(var i = 0; i < $scope.similarBandsArray.length; i ++){ //going through every related artist from the search
                  var counter = 0;
                  for (var x = 0; x < $scope.allTheArtists.length; x ++){ //going through every artist in the allTheArtistsArray
                    if($scope.similarBandsArray[i].name === $scope.allTheArtists[x].name){
                      counter ++;
                      if (counter > 0){
                        var toBeAddedToMutual = {
                          name: $scope.similarBandsArray[i],
                          count: counter
                        };
                      $scope.newMatchingArray.push(toBeAddedToMutual);
                      }
                    }
                    if($scope.soManyObjects && $scope.soManyObjects.amount > 0 ){
                        $scope.bigBoyArray.push($scope.soManyObjects.name + "and their count is" + ($scope.soManyObjects.amount + 1));
                      }
                  }
                }
                for(var j = 0; j < $scope.similarBandsArray.length; j ++){
                  $scope.allTheArtists.push($scope.similarBandsArray[j]);
                }
              }
            });
          };

当您找到第一个匹配时,counter变为1。然后创建一个对象toBeAddedToMutual并将其插入数组。计数怎么可能是其他值呢?

你的意思是把第二个if-block从第一个if-block中移出来吗?

var counter = 0;
for (var x = 0; x < $scope.allTheArtists.length; x ++){
  if ($scope.similarBandsArray[i].name === $scope.allTheArtists[x].name){
    counter ++;
  }
  if (counter > 0) {
    var toBeAddedToMutual = {
      name: $scope.similarBandsArray[i],
      count: counter
    };
    $scope.newMatchingArray.push(toBeAddedToMutual);
  }
....

正如@FernandoPinheiro建议的那样,您可以使用lambda表达式缩短代码。

angular.forEach($scope.similarBandsArray, function(band) {
  var matches = $scope.allTheArtists.filter(function(artist) {
    return band.name === artist.name;
  });
  if (matches.length) {
    $scope.newMatchingArray.push({
      name: band, // maybe you mean band.name
      count: matches.length
    });
  }
  ....
});

查看此库:https://lodash.com/

它包含了你的算法可能需要的所有函数,比如数组之间的差异,过滤器等