簡體   English   中英

在創建新的對象數組時遇到麻煩(在循環內部循環)

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

我想做的是比較兩個數組“ similarBands”和“ artistsArray”。 我想記下兩個數組中發生的每個匹配(這是我創建計數器的邏輯)。 我要尋找的最終結果是一個新的對象數組(稱為newMatchingArray),這兩個數組的所有匹配項都將具有name屬性和matchs屬性(指示存在多少個匹配項)。

該函數現在可以正確找到匹配項,但不會在每次匹配中都增加“計數器”,而是在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 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/

它具有算法可能需要的所有功能,例如數組,過濾器之間的差異等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM