我有使用lodash的代码:
_.remove(this.home.modal.data.subTopics, function (currentObject) {
return currentObject.subTopicId === subTopicToDelete;
});
有人可以在没有lodash的情况下使用现代浏览器功能为我提供如何做同样的建议吗?
请注意,删除的输出可以进入另一个变量。
答案 0 :(得分:2)
您可以使用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);
});
}
答案 1 :(得分:2)
为什么不看看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
调用在这里并不是很有意思,只需用谓词函数替换它,该函数返回给定参数的布尔值:value,index,array。并非所有这些都需要显式提供,毕竟这是JavaScript!)
Lodash在适当的位置使用Array.prototype.splice
,将删除的元素推送到结果数组。然后它使用length
将当前循环索引和保存的--
减少1,因为每次使用.splice
时,都会直接修改数组,例如:
var arr = ['a', 'b'];
arr.splice(0, 1);
arr[1] // undefined
在此上下文中, splice
与Array.prototype.splice
完全相同。您也可以array.splice(index--, 1)
。
一种更简单/可理解的方法是(for-)从右侧循环遍历数组,从array.length - 1
开始到0
结束。然后拼接当前索引处的每个元素(如果它通过谓词函数),并将该操作的结果值推送到结果数组。循环后返回结果数组。
这也是一样的,因为如果你开始从右侧删除元素,其余循环元素的索引不会改变。也许lo-dash代码有性能优势,但我无法告诉你。
答案 2 :(得分:1)
您可以根据自己的需要调整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');