Angular / lodash - 从集合中删除多个对象

时间:2015-12-21 19:16:30

标签: javascript angularjs

解决我的原始问题

感谢Dan在下面给出的答案,我已经成功地减少了我的原始代码。我已经放弃了一些我最初构建的灵活性,即使用多属性和静态道具,但在后来的版本中很容易修复,在代码大小方面也很简单:)再次,非常感谢Dan。在这个例子中,我包含了一个包含在Angular Collection工厂中的2个forget()方法。

Collection.$inject = ['Constructor', 'Article'];
function Collection(Constructor, Article) {

    var Model = Article,
        Collection = {},
        collection = [],
        add,
        forget;

    function Extendable(data, keys) {
        Constructor.call(this, data, Model.fillable);
    }

    Extendable.prototype = Object.create(Constructor.prototype);
    Extendable.prototype.constructor = Extendable;
    Collection = Extendable.prototype;
    collection = Collection.items = [];

    add = function(item) {
        if (item instanceof Model) {
            collection.push(item);
        }
    };
    Collection.add = add;

    // EXAMPLE OF SINGLE ID DELETE I.E. SIMPLE VERSION
    forget = function(id) {
        collection = _.dropWhile(collection, {id: id});
    };
    Collection.forget = forget;

    // OR!!! EXAMPLE OF MULTI ID VALUE || ARRAY
    forget = function(id) {
        var ids = [];
        if (_.isArray(id)) {
            ids = id;
        } else {
            ids.push(parseInt(id));
        }
        return _.dropWhile(collection, function (n) {
            return _.includes(ids, n.id);
        });
    };
    Collection.forget = forget;

    // remove rest of factory for brevity sake
    return Extendable;
};

DEV工具

Angular 1.4.8,lodash 2.x

问题:

我仍然是一个Angular& JS。是否有更简洁的方法来删除多个对象实例(例如文章集中的文章/ s)。 forget()方法接受1个参数,该参数可以是字符串|| integer || array(字符串或整数)

示例:

var articleIdsToRemove = [1, '2', 3];

OR

var articleIdsToRemove = 1; 

var articles = newCollection();

为了简洁起见,我已经排除了将文章实例添加到集合中的添加方法,但我们假设我们有10个,每个都有一个id

我当前的方法

  1. 验证上面的值类型,即array,str,int,并将所有值设置为整数数组,即ids
  2. 然后遍历id数组以查找Article的索引 具有道具id并且等于值id
  3. 的实例
  4. 如果发现将索引推到索引上。一个我们都匹配 索引然后发送它Array.prototype.remove以删除多个 集合数组中的项目。完成后再重新排序 集合
  5. 为了简洁起见,

    删除了Angular工厂包装器,但假设所有这些都在一个名为Collection的角度工厂中,它注入了一个作为数据模型的Article工厂。总之,Collection(文章)包含许多Article

        // We set a collections array inside of object to hold all Article instances
        collection = Extendable.prototype.items = [];
        // NOTE add articles method removed, but assume weve added multiple Article's to collection 
    
        forget = function(id) {
            var ids = [],
                index = null,
                indices = [];
            if (angular.isDefined(id) && !_.isEmpty(id)) {
                ids = _.isArray(id) ? id : isInt(id) ? [Number(id)] : [];
                if (ids.length) {
                    _.each(ids, function(id) {
                        index = getIndex('app_id', id);
                        if (index) {
                            indices.push(index)
                        }
                    });
                    if (indices.length) {
                        collection = collection.remove(indices)
                    }
                }
            }
        };
        Extendable.prototype.forget = forget;
    
        function isInt(n){
            return Number(n) === n && n % 1 === 0;
        }
    
        function getIndex(prop, value) {
            return _.indexOf(collection, function(d) {
                if (hasProp(d, prop)) {
                    return d[prop] == value;
                }
            });
        }
    
        function hasProp (obj, prop) {
            return Object.prototype.hasOwnProperty.call(obj, prop);
        }
    
        Array.prototype.remove = function(){
            var args = Array.apply(null, arguments);
            var indices = [];
            for(var i = 0; i < args.length; i++){
                var arg = args[i];
                var index = this.indexOf(arg);
                while(index > -1){
                    indices.push(index);
                    index = this.indexOf(arg, index + 1);
                }
            }
            indices.sort();
            for(var i = 0; i < indices.length; i++){
                var index = indices[i] - i;
                this.splice(index, 1);
            }
        };
    

1 个答案:

答案 0 :(得分:2)

看看这个

var forget = function(id) {
  var ids = [];
  if (_.isArray(id)) {
    ids = id;
  } else {
    ids.push(parseInt(id));
  }
  return _.dropWhile(articles, function(n) {
    return _.includes(ids, n.id);
  });
}

此处示例:http://jsfiddle.net/hFm7j/226/