【问题标题】:remove object from array if property value match如果属性值匹配,则从数组中删除对象
【发布时间】:2018-06-08 18:07:28
【问题描述】:

我有一组看起来像这样的对象:

{
  "brandid": id,
  "brand": string,
  "id": id,
  "categoryId": id,
  "category": string,
  "factory": string,
  "series": string,
  "status": 0,
  "subStatus": 1
}

如果系列属性值与数组中其他对象中的另一个系列属性值匹配,则需要从数组中删除该对象。

目前我试图将它们推送到一个重复的数组中:

      const seriesResCopy = seriesRes;
      const dupArray = []
      for (const thing of seriesResCopy) {
        for (const item of seriesRes) {
          if (thing.series === item.series) {
            dupArray.push(item);
          }
        }
      }

但这不起作用。从示例来看,我的问题似乎是我没有要查找的重复值的明确列表。

任何帮助将不胜感激。

【问题讨论】:

  • push() 不会从数组中删除元素,它只是将引用(如果是原始数组,则为复制)放入另一个数组。
  • 你实际上并没有删除任何东西。这可以通过.splice 完成
  • 所以你想过滤掉重复、三次等?只保留第一个实例?
  • 我想过滤重复并保留第一个实例。
  • @mplungjan“对象数组”不是“我有一个对象”。不要改变问题!

标签: javascript arrays angular


【解决方案1】:

您可以使用一组系列来过滤掉重复项:

const exists = new Set();
seriesRes = seriesRes.filter(({series}) => !exists.has(series) && exists.add(series));

这使用:Array.prototype.filter,对象解构和一些逻辑技巧。

同样可以通过改变数组来完成:

const exists = new Set();
for(const [index, {series}] of seriesRes.entries()) {
  if(!exists.has(series) {
    exists.add(series);
  } else {
    seriesRes.splice(index, 1);
  }
}

【讨论】:

  • 请分解代码并评论它的作用。它非常优雅但也非常新(截至 2018 年 6 月)
  • set 的绝妙想法,我用过lately,或者以后。
  • @mplungjan 如果您更改问题,为什么答案仍然合适?!?
  • @mplungjan OP 已接受此答案。因此,如果您说“这不适用于我用 OPs 代码制作的奇怪的 sn-p”,那么这是您的错误,而不是我的错误。
  • 这不是提问者第一次发布一个对象并将其称为数组。所以我所要做的就是把 [] 包裹起来。如果我认为 OP 显示了一个有效的数组,那将很有用。所以没那么奇怪。无论如何,您的代码仍然很有趣
【解决方案2】:

从数组中过滤重复并保留第一个实例:

let seriesWithoutDuplicates = seriesRes.filter((s, i, self) => {
    return self.findIndex(z => z.series === s.series) === i;
});

【讨论】:

    猜你喜欢
    • 2021-11-07
    • 2021-11-03
    • 2017-06-11
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 2020-04-09
    相关资源
    最近更新 更多