如果比较列表中不存在,则从列表中删除项目

时间:2014-04-07 13:35:35

标签: jquery knockout.js

在我的小提琴中,您可以将项目从列表复制到另一个列表,还有一个包含普通项目的重复列表,用于比较。现在你可以删除第二个列表中的所有项目,但我只希望能够删除那个包含普通项目的项目中不存在的项目。

代码如下所示:

var SProcsViewModel = function () {
   var self = this;
   self.storedProceduresInDB1 = ko.observableArray([{
    Name: "Sp1",
    Id: 1
   }, {
       Name: "Sp2",
       Id: 2
   }, {
       Name: "Sp3",
       Id: 3
   }, {
       Name: "Sp4",
       Id: 4
   }]);
   self.storedProceduresInDB2Orig = ko.observableArray([{
       Name: "Sp3",
       Id: 3
   }, {
       Name: "Sp4",
       Id: 4
   }, {
       Name: "Sp7",
       Id: 7
   }, {
       Name: "Sp8",
       Id: 8
   }]);
   self.storedProceduresInDB2 = ko.observableArray([{
       Name: "Sp3",
       Id: 3
   }, {
       Name: "Sp4",
       Id: 4
   }, {
       Name: "Sp7",
       Id: 7
   }, {
       Name: "Sp8",
       Id: 8
   }]);

   self.selectedStoredProceduresInDb1 = ko.observableArray();
   self.selectedStoredProceduresInDb2 = ko.observableArray();

   self.copyToDb2 = function () {
       var sprocs = [];
       console.log('self.selectedStoredProceduresInDb1()', self.selectedStoredProceduresInDb1());
       ko.utils.arrayForEach(self.selectedStoredProceduresInDb1(), function (value) {
        // console.log('arrayForEach',value,self.storedProceduresInDB2);
          var match = ko.utils.arrayFirst(self.storedProceduresInDB2(), function (item) {
              console.log('item in storedProceduresInDB2', value, item);
              return value.Id === item.Id;
          });

          if (!match) {
            console.log('No match, so add to sprocs', value);
            sprocs.push(value);
          } else {
            console.log('Match found for:', value);
          }
       });

    ko.utils.arrayForEach(self.selectedStoredProceduresInDb1(), function (value) {
        console.log('storedProceduresInDB1', value);
    });


    console.log('sprocs', sprocs);

    ko.utils.arrayPushAll(self.storedProceduresInDB2, sprocs)
   };

   self.removeFromDb2 = function(item, event){       
       self.storedProceduresInDB2.remove(function(item) {
           return item.Name == $(event.currentTarget).find("option:selected").text();
       });
   }

   return self;
};

ko.applyBindings(new SProcsViewModel());

JSFiddle

1 个答案:

答案 0 :(得分:1)

ko.utils.arrayFirst的帮助下,您可以检查所点击的项目是否在原始列表中(storedProceduresInDB2Orig)。

如果ko.utils.arrayFirst返回了某些内容,那么您只需要在return false回调中remove,您的商品就不会被移除:

self.removeFromDb2 = function(item, event){       
    self.storedProceduresInDB2.remove(function(item) {
        var nameToRemove = $(event.currentTarget).find("option:selected").text();
        var isInOrig = ko.utils.arrayFirst(self.storedProceduresInDB2Orig(), 
            function(item){
                return item.Name == nameToRemove;
        });
        if (isInOrig)
            return false;

        return item.Name == nameToRemove;
    });
}

演示JSFiddle