如何在现代浏览器中实现lodash _.remove函数?
我一直在使用lodash此代码:如何在现代浏览器中实现lodash _.remove函数?
_.remove(this.home.modal.data.subTopics, function (currentObject) {
return currentObject.subTopicId === subTopicToDelete;
});
有人可以给我建议,我怎么可以做同样的使用最新的浏览器功能,而lodash?
请注意,删除的输出可能会进入另一个变量。
你可以使用Array#filter()
和否定筛选子句:
this.home.modal.data.subTopics.filter(function (currentObject) {
return currentObject.subTopicId !== subTopicToDelete;
});
这将返回一个数组,其中subTopicId
不等于subTopicToDelete
。然后由您决定将其保存在变量或任何地方。
或者,如果你想创建出来的一个方法,你可以这样做:
function remove(array, filterMethod) {
return array.filter(function(){
return !filterMethod.apply(this, arguments);
});
}
查看源代码请注意,这会得到正确的一组结果,但不同于'_.remove'它不会修改原始数组。您需要将'filter'的返回值分配给'this.home.modal.data.subTopics'。 – lonesomeday 2014-11-04 14:25:34
@lonesomeday - 感谢您的反馈。如果原始数组没有被修改,我没关系。 – 2014-11-04 14:28:05
我很好奇为什么这是downvoted。 – Scimonster 2014-11-04 14:28:39
你可以适应Array.prototype
满足您的需求。有些人不喜欢这种方法,但有时候它会很有用。在这个例子中,我通过在键和值我想通过修改阵列:
if (!Array.prototype.remove) {
Array.prototype.remove = function (key, value) {
return this.filter(function (el) {
return el[key] !== value;
});
}
}
data.remove('name', 'dan');
为什么不看看lodash的source code for _.remove
?
function remove(array, predicate, thisArg) {
var index = -1,
length = array ? array.length : 0,
result = [];
predicate = getCallback(predicate, thisArg, 3);
while (++index < length) {
var value = array[index];
if (predicate(value, index, array)) {
result.push(value);
splice.call(array, index--, 1);
length--;
}
}
return result;
}
(该getCallback
呼叫是不是真的很有趣在这里,只是与返回给定参数的布尔值谓词函数代替它:值,指数,阵列并非所有的人都需要得到明显供应,这毕竟是JavaScript!)
Lodash在适当的位置使用Array.prototype.splice
,将移除的元素推到结果数组上。然后,它减少了电流回路指数和保存length
使用--
1,因为每次使用.splice
时间,您可以直接修改数组,例如:在这方面真的只是一样Array.prototype.splice
var arr = ['a', 'b'];
arr.splice(0, 1);
arr[1] // undefined
splice
。你也可以做array.splice(index--, 1)
。
甲也许更简单/易于理解的方式是:(换)循环通过从右侧的阵列,起始于array.length - 1
和0
结束。然后拼接当前索引处的每个元素,如果它传递了谓词函数,并将该操作的结果值推送到结果数组上。循环后返回结果数组。
工作原理相同,因为如果您从右侧开始删除元素,其余循环元素的索引不会更改。也许lo-dash的代码具有性能优势,但我无法告诉你这一点。
您可以通过https://github.com/lodash/lodash/blob/master/lodash.js#L4060-L4075 – 2014-11-04 14:29:07