如何在现代浏览器中实现lodash _.remove功能?

时间:2014-11-04 14:20:29

标签: javascript lodash

我有使用lodash的代码:

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

有人可以在没有lodash的情况下使用现代浏览器功能为我提供如何做同样的建议吗?

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

3 个答案:

答案 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
在此上下文中,

spliceArray.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');

DEMO