首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JavaScript数组:有没有介于splice和filter之间的方法?

JavaScript数组:有没有介于splice和filter之间的方法?
EN

Stack Overflow用户
提问于 2018-09-28 23:48:44
回答 5查看 89关注 0票数 0

我有一个对象数组,并且想要:

  1. 从数组中删除某些对象
  2. 在第二步中处理已删除的对象

我事先不知道这些物体在哪里。为了识别它们,我需要使用一个函数来查询它们的属性。在第二个数组中检索已删除的对象是有意义的。

我曾希望找到像filtersplice这样的本机方法来做这件事。以下是我提出的解决方案:

代码语言:javascript
复制
if (!Array.prototype.cherrypick) {
  Array.prototype.cherrypick = function(fn) {
    let basket = []
    let ii = this.length
    let item

    for ( ; ii-- ; ) {
      item = this[ii]

      if (fn(item)) {
        basket.unshift(item)
        this.splice(ii, 1)
      }
    }

    return basket
  }
}

我错过了什么吗?有没有一个本机方法已经可以做到这一点?我的解决方案在某些方面是不可靠的吗?

EN

回答 5

Stack Overflow用户

发布于 2018-09-28 23:54:56

Array.filter()这样的方法返回一个新的数组,而不是改变原来的数组。

您可以使用Array.reduce()创建一个分区方法,该方法将返回两个数组-通过谓词的数组和失败的数组:

代码语言:javascript
复制
const partition = (predicate, arr) =>
  arr.reduce((r, o) => {
    r[+!!predicate(o)].push(o);
    
    return r;
  }, [[], []]);
  
const arr = [4, 8, 3, 10, 12];

const result = partition(n => n > 5, arr);

console.log(result);

您可以使用分区逻辑和Array.splice()来创建cherrypick方法:

代码语言:javascript
复制
if (!Array.prototype.cherrypick) {
  Array.prototype.cherrypick = function(predicate) {
    const [removedItems, items] = arr.reduce((r, o) => {
      r[+!!predicate(o)].push(o);

      return r;
    }, [[], []]);
    
    this.splice(0, arr.length, items);
    
    return removedItems;
  }
}

const arr = [4, 8, 3, 10, 12];

const removed = arr.cherrypick(n => n > 5);

console.log('arr ', arr);

console.log('removed ', removed);

票数 1
EN

Stack Overflow用户

发布于 2018-09-28 23:52:49

只需过滤两次:

代码语言:javascript
复制
const picked = array.filter(fn);
array = array.filter((el, i, a) => !fn(el, i, a));
票数 0
EN

Stack Overflow用户

发布于 2018-09-29 00:06:44

按如下方式使用reduce:

代码语言:javascript
复制
  array = [1,2,3,4,5,6,7];
  fn = n => n % 3 == 0;
  [array, picked] = array.reduce ( (r, el) => (r[+fn(el)].push (el), r), [[], []] ) 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52558800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档