2016-05-24 76 views
-1

來自noob的簡單問題。避免重複記錄中的鍵值結構JS

我有這個例子,我創建一個帶有鍵/值結構的列表,我使用Id作爲鍵,其餘的內容是值,所以如果我添加更多的記錄,他們將被添加到我的列表$ scope.itemList []

var data = [ 
       { 
       id: 1, 
       name : "Peter", 
       lastname : "Smith", 
       age : 36 
       }, { 
       id: 2, 
       name : "Peter", 
       lastname : "Smith", 
       age : 36 
       } 
      ]; 

      $scope.itemList = []; 
      angular.forEach(data, function(item){ 
       var obj = {}; 
       var valObj = {}; 

       valObj.name = item.name; 
       valObj.lastname = item.lastname; 
       valObj.age = item.age; 

       obj[item.id] = valObj; 
       $scope.itemList.push(obj); 
      }); 

的事情是,我可以在我的JSON用相同的ID有更多的記錄,我想避免增加重複記錄,現在這個代碼將推動一切它有它無重要的是如果id的重複,但我不知道如何比較var obj {}與item.id,我嘗試了不同的「選項」,但沒有一個工作。

一些這方面的幫助將是巨大的,我會明白了很多

+0

爲什麼你有2個對象,1 obj和第二個是valObj? –

+0

嗨, obj是存儲來自作爲我的「關鍵」的ID的值,valObj將我的json(名稱,姓氏和年齡)中的其餘記錄存儲爲「值」 – kennechu

+0

是的,它背後的原因是什麼? –

回答

1

如果您從列表中改變了itemList中以一本字典,我認爲它會做你的需要。例如:

var data = [ 
       { 
       id: 1, 
       name : "Peter", 
       lastname : "Smith", 
       age : 36 
       }, { 
       id: 2, 
       name : "Peter", 
       lastname : "Smith", 
       age : 36 
       } 
      ]; 

      $scope.itemDictionary = {}; 
      angular.forEach(data, function(item){ 
       var obj = {}; 
       var valObj = {}; 

       valObj.name = item.name; 
       valObj.lastname = item.lastname; 
       valObj.age = item.age; 

       obj[item.id] = valObj; 
       if(!$scope.itemDictionary[item.id]){ 
        $scope.itemDictionary[item.id] = obj; 
       } 
      }); 
+0

嗨bwyn, 我在這段代碼中的時刻你「推」數據,它的工作原理,我已經測試過,因爲我記錄結果,但是當這種情況發生時我不知道。 – kennechu

1

解決方案

var data = [ 
    { 
    id: 1, 
    name : "Peter1", 
    lastname : "Smith", 
    age : 36 
    }, { 
    id: 2, 
    name : "Peter2", 
    lastname : "Smith", 
    age : 36 
    }, { 
    id: 2, 
    name : "Peter3", 
    lastname : "Smith", 
    age : 36 
    } 
]; 

$scope.itemList = []; 
angular.forEach(data, function(item){ 
    var obj = {}; 
    var valObj = {}; 

    valObj.name = item.name; 
    valObj.lastname = item.lastname; 
    valObj.age = item.age; 

    if (!obj[item.id]) { 
    obj[item.id] = valObj; 
    $scope.itemList.push(obj); 
    } 

}); 

但是,如果你沒有一個很好的理由OBJ [item.id]那麼你應該看着lodash的findIndex或類似的東西。

我的意思是我不能看到一個原因,你將不得不有2個獨立的對象。

更新

var data = [ 
    { 
    id: 1, 
    name : "Peter1", 
    lastname : "Smith", 
    age : 36 
    }, { 
    id: 2, 
    name : "Peter2", 
    lastname : "Smith", 
    age : 36 
    }, { 
    id: 2, 
    name : "Peter3", 
    lastname : "Smith", 
    age : 36 
    } 
]; 

$scope.itemsList = []; 
angular.forEach(data, function(item){ 
    if(_.findIndex($scope.itemsList, function(itemList){ return item.id === itemList.id }) === -1){ 
    $scope.itemsList.push(item); 
    } 
}); 
+0

非常感謝您的時間.. 那麼避免使用兩個對象有什麼更好的選擇,我的意思是,我是這樣做的,因爲它適用於我,我得到了預期的結果,但是如果有方法來優化它,我會打開,因爲我學習=) – kennechu

+0

將編輯和告訴你 –

+0

檢查更新, - 使用lodash,你可以很容易地做一個函數,以取代_.findIndex –