解决我的原始问题
感谢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
我当前的方法
ids
Article
的索引
具有道具id
并且等于值id
Array.prototype.remove
以删除多个
集合数组中的项目。完成后再重新排序
集合删除了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);
}
};
答案 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);
});
}