【问题标题】:How to remove object from array depending on child condition JS如何根据子条件JS从数组中删除对象
【发布时间】:2019-08-29 02:12:02
【问题描述】:

我正在尝试根据属性从数组中删除/或拼接对象。如果属性字符串包含一个字符串,则从数组中删除该对象。因此,根据其在字符串数组中循环的属性来过滤对象。

我有一个这样的对象

let obj = [
    {
        "name": "product one"
    },
    {
        "name": "product two"
    },
    {
        "name": "item one"
    },
    {
        "name": "item three"
    }
]    

一个数组

let arr = ['one', 'item'] 

所以我希望我的最终或返回对象看起来像

[
  {
    name: "product two"
  }
]

我尝试过 for 循环、双重 for 循环、过滤器和包含,但都失败了。 需要注意的一件事是我正在导入的 json 文件有超过 20,000 条记录,所以如果那是它可能失败的原因,请注意。

 var intersection = obj.filter(function (e) {
      for (const word of arr) {
         return !e.name.includes(word)
      }
   });

【问题讨论】:

    标签: javascript arrays object ecmascript-6


    【解决方案1】:

    要查找数组中包含的项目,请在arr 上使用some 并反转返回的布尔值:

    const intersection = obj.filter(({ name }) => !arr.some(e => name.includes(e)));
    

    如果有很多记录,那么上面的方法可能太慢了——这种方法效率更高:

    const re = new RegExp(arr.join("|"));
    const intersection = obj.filter(({ name }) => !re.test(name));
    

    【讨论】:

    • 完美我从来没有想过加入它然后过滤它。谢谢
    • 不用担心@FernandoB,总是乐于提供帮助。如果我的回答解决了您的问题,请接受。
    【解决方案2】:

    问题是您的循环在第一次迭代后返回,这意味着您只检查元素的 name 值是否与 arr 数组中的第一个元素匹配。

    您可以使用.some() 代替循环,这是一个示例:

    let obj = [{
        "name": "product one"
      },
      {
        "name": "product two"
      },
      {
        "name": "item one"
      },
      {
        "name": "item three"
      }
    ]
    
    let arr = ['one', 'item']
    
    const intersection = obj.filter(({
      name
    }) => !arr.some(v => name.includes(v)));
    console.log(intersection);

    【讨论】:

    • 谢谢!我从未听说过或完全忘记了 some 方法
    猜你喜欢
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 2015-12-07
    • 1970-01-01
    相关资源
    最近更新 更多