如何在现代浏览器中实现lodash _.remove函数?

问题描述:

我一直在使用lodash此代码:如何在现代浏览器中实现lodash _.remove函数?

_.remove(this.home.modal.data.subTopics, function (currentObject) { 
     return currentObject.subTopicId === subTopicToDelete; 
    }); 

有人可以给我建议,我怎么可以做同样的使用最新的浏览器功能,而lodash?

请注意,删除的输出可能会进入另一个变量。

+1

您可以通过https://github.com/lodash/lodash/blob/master/lodash.js#L4060-L4075 – 2014-11-04 14:29:07

你可以使用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); 
    }); 
} 
+0

查看源代码请注意,这会得到正确的一组结果,但不同于'_.remove'它不会修改原始数组。您需要将'filter'的返回值分配给'this.home.modal.data.subTopics'。 – lonesomeday 2014-11-04 14:25:34

+0

@lonesomeday - 感谢您的反馈。如果原始数组没有被修改,我没关系。 – 2014-11-04 14:28:05

+1

我很好奇为什么这是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'); 

DEMO

为什么不看看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 - 10结束。然后拼接当前索引处的每个元素,如果它传递了谓词函数,并将该操作的结果值推送到结果数组上。循环后返回结果数组。

工作原理相同,因为如果您从右侧开始删除元素,其余循环元素的索引不会更改。也许lo-dash的代码具有性能优势,但我无法告诉你这一点。