2014-09-30 93 views
0

我已經完成了以下步驟以循環遍歷AngularJS中的兩個對象列表,並有條件地創建一個新的對象列表。Underscore.js過濾器操作動態創建對象列表

$scope.loading = true; 
$scope.toUpdate = []; 
for (var i = 0; i < changedItems.length; i++) { 
    for (var j = 0; j < $scope.originalItems.length; j++) { 
    if (changedItems[i].AttributeName == $scope.originalItems[j].AttributeName 
     && changedItems[i].Value != $scope.originalItems[j].Value) { 
      $scope.toUpdate.push(changedItems[i]); 
    } 
    } 
} 

我創建對象的列表,如果值是由用戶改變(該$scope.originalItems具有原始值)。

我把它發送給MVC控制器來更新更改。

我這樣做是因爲我不需要更新那些沒有改變的值。

這種方法正在進行很多迭代。

要求:

我相信,這可能是以直接的方式使用Underscore.js但我不能夠做到這一點。

需要幫助將此邏輯轉換爲Underscore。

+2

沒有下劃線在這裏抨擊,我不是專家,但你應該檢查'lo-dash'。它受到下劃線的啓發,但應該更高效,並具有更多功能。如在這裏看到的:http://stackoverflow.com/questions/13789618/differences-between-lodash-and-underscore。我只是在這裏評論它,所以你可以檢查一下,如果你的項目是新的,你仍然可以輕鬆地取代它。 – Tsasken 2014-09-30 08:42:59

回答

1

您的代碼可以被轉換爲下劃線這樣的:

_.each(item,function(i){ 
    _.each($scope.previous,function(p) { 
     if (i.AttributeName == p.AttributeName && i.Value != p.Value) 
      $scope.toUpdate.push(i); 
    }); 
}); 

但我認爲你想避免項目的複製,那麼你可以試試這個:

$scope.toUpdate = _.filter(item,function(i) { 
    return _.any($scope.previous,function(p){ 
     return i.AttributeName == p.AttributeName && i.Value != p.Value; 
    }); 
}); 

JSFiddle

更新

檢查下面的文檔:.each.filter_.any

+0

您的解決方案有效,但我可能知道您的解決方案的工作方式? – RandomUser 2014-09-30 08:51:11

+1

檢查Lodash的文檔(絕對贊同Tsasken,它的方式比Underscore改進得多) – jevgenig 2014-09-30 08:55:43

+0

而且btw:你能否改寫你的問題「如何解決工作」:) – jevgenig 2014-09-30 08:58:52