2017-05-09 146 views
0

我有這個algorithme問題,我想檢查對象是已經出現在我的數組將它添加之前。如何在添加對象之前檢查對象是否已經存在?

我嘗試了許多不同的方法(的indexOf,過濾器......),我的最後一次嘗試是有angular.foreach。

問題是我的$ scope.newJoin仍然總是空的。我恍然大悟,那是因爲0大小我的$ scope.newJoin的,因爲如果沒有念過,但我不知道怎麼算出這個...


$ scope.newJoinTMP由組成:6點的對象,每一個內timePosted屬性(用於比較這些不同陣列對象)。

$ scope.newJoin是一個空數組。我想用它填充裏面的Objects $ scope.newJoinTMP但是肯定有一次每個對象,並不是兩倍相同($ scope.newJoinTMP可以有重複的對象裏面,但是$ scope.newJoin mustn' T)。

    angular.forEach($scope.newJoinTMP, function(item) 
 
        { 
 
         
 
         angular.forEach($scope.newJoin, function(item2) 
 
         { 
 
          if (item.timePosted === item2.timePosted) 
 
          { 
 
           //snap.val().splice(snap.val().pop(item)); 
 
           console.log("pop"); 
 
          } 
 
          else 
 
          { 
 
           $scope.newJoin.push(item); 
 
           console.log("newJoin :", $scope.newJoin); 
 
          } 
 
         }); 
 
        });

回答

0

您可以使用reduce

$scope.newJoin = $scope.newJoinTMP.reduce(function(c, o, i) { 
    var contains = c.some(function(obj) { 
     return obj.timePosted == o.timePosted; 
    }); 

    if (!contains) { 
     c.push(o); 
    } 

    return c; 
}, []); 

的問題與當前的代碼,如果newJoin是空的,什麼都不會被添加到它 - 如果它不是空,如果第一次迭代與newJoinTMP中正在迭代的當前項目不匹配 - 您正在推送。

1
if(!$scope.newJoin.find(el=>item.timePosted===el.timePosted){  
     $scope.newJoin.push(item); 
     console.log("newJoin :", $scope.newJoin); 
} 

你不想推送的forEach內,因爲這會推多次...

+0

哦這是一個錯誤,我一直在做的,謝謝你指出它...如何更換一個foreach裏推? 在每個循環中增加一個簡單的索引值?像這樣:$ scope.newJoin [i] = item? – Memphis

+0

@memphis:再看看我的代碼(它已經包含了答案;)) –

1

可能有更好的方式來處理你的特殊情況,但這裏是爲您的特定代碼修復。 替換你內心的每一個與一些這對於元素的存在,並通過布爾值返回布爾值,決定是否加元或不

   angular.forEach($scope.newJoinTMP, function(item) 
       { 

        var isItemPresent = $scope.newJoin.some(function(item2) 
        { 
         return item.timePosted === item2.timePosted; 
         //you dont need this conditional handling for each iteration. 
         /* if (item.timePosted === item2.timePosted) 
         { 
          //snap.val().splice(snap.val().pop(item)); 
          console.log("pop"); 
         } 
         else 
         { 
          $scope.newJoin.push(item); 
          console.log("newJoin :", $scope.newJoin); 
         } */ 
        }); 
        if(! isItemPresent) { 
         $scope.newJoin.push(item); 
        } else { 
         //do if it was present. 
        } 
       }); 
1

如果你想避免嵌套循環(的forEach,一些的indexOf ,或者其他),你可以使用一個輔助對象。它會使用更多的記憶,但你會花更少的時間。

let arr = [{ id: 0 }, { id:0 }, { id: 1}]; 
 
let aux = {}; 
 

 
const result = arr.reduce((result, el) => { 
 
    if (aux[el.id] === undefined) { 
 
    aux[el.id] = null; 
 
    return [el, ...result]; 
 
    } else { 
 
    return result; 
 
    } 
 
}, []); 
 

 
console.log(result);

相關問題