【问题标题】:How to delete duplicate values of objects inside array?如何删除数组内对象的重复值?
【发布时间】:2019-03-21 19:51:55
【问题描述】:

我发现了一些关于如何删除对象中重复值的参考资料,例如thisthisthis... 在所有这些示例(以及我发现的其他示例)中,都是针对简单对象的,但是我的情况更“复杂”。

我有一个数组,其中每个索引都有你的值和一个对象。我创建一个简单的例子来解释:

var data = [
  {
    "name": "Kyle",
    "item": [
      {
        "id": 1,
        "name": "name1"
      },
      {
        "id": 2,
        "name": "name2"
      },
      {
        "id": 3,
        "name": "name3"
      },
      {
        "id": 2,
        "name": "name2"
      }
      {
        "id": 3,
        "name": "name3"
      }
    ]
  },
  {
    "name": "Liza",
    "item": [
      {
        "id": 1,
        "name": "name1"
      },
      {
        "id": 1,
        "name": "name1"
      },
      {
        "id": 2,
        "name": "name2"
      }
    ]
  },
  {
    "name": "John",
    "item": [
      {
        "id": 1,
        "name": "name1"
      },
      {
        "id": 1,
        "name": "name1"
      },
      {
        "id": 4,
        "name": "name4"
      },
      {
        "id": 4,
        "name": "name4"
      },
      {
        "id": 2,
        "name": "name2"
      }
    ]
  },
  {
    "name": "Melissa",
    "item": [
      {
        "id": 2,
        "name": "name2"
      }
    ]
  }
]

您如何看到,在我的 item 对象中我有重复值...我想删除我的对象中的这些重复值。

一种方法(我认为)是复制我的列表并使用forEach/map/filter,但我不知道该怎么做。

我试过了,但是不行:

let dataCopy = data;

dataCopy.forEach(dataItem => {
  listPrev.forEach(dataPrev => {

    //??

    //and or...
    if(dataPrev.item.id == dataItem.item.id){          
      //??

    }
  })
})

我正在努力获得这样的回报:

var data = [
  {
    "name": "Kyle",
    "item": [
      {
        "id": 1,
        "name": "name1"
      },
      {
        "id": 2,
        "name": "name2"
      },
      {
        "id": 3,
        "name": "name3"
      },
    ]
  },
  {
    "name": "Liza",
    "item": [
      {
        "id": 1,
        "name": "name1"
      }
      {
        "id": 2,
        "name": "name2"
      }
    ]
  },
  {
    "name": "John",
    "item": [
      {
        "id": 1,
        "name": "name1"
      },
      {
        "id": 4,
        "name": "name4"
      },
      {
        "id": 2,
        "name": "name2"
      }
    ]
  },
  {
    "name": "Melissa",
    "item": [
      {
        "id": 2,
        "name": "name2"
      }
    ]
  }
]

我该怎么做? 有人可以帮助我吗?

【问题讨论】:

    标签: javascript arrays json


    【解决方案1】:

    简单的forEachfilter 就可以了:

    data.forEach(d => {
        d.item = d.item.filter((item, index, self) => {
            return index === self.findIndex(z => z.id == item.id)
        });
    });
    

    【讨论】:

    • 非常感谢您的帮助!一个疑问:我在filter 文档中读到第三个参数等同于`this`。这就像一个参考自己的值被过滤,对吧?
    • 是的,第三个参数是指正在处理的数组。
    【解决方案2】:

    使用Array.map() 迭代数组,并对每个item 数组应用数组唯一函数:

    const data = [{"name":"Kyle","item":[{"id":1,"name":"name1"},{"id":2,"name":"name2"},{"id":3,"name":"name3"},{"id":2,"name":"name2"},{"id":3,"name":"name3"}]},{"name":"Liza","item":[{"id":1,"name":"name1"},{"id":1,"name":"name1"},{"id":2,"name":"name2"}]},{"name":"John","item":[{"id":1,"name":"name1"},{"id":1,"name":"name1"},{"id":4,"name":"name4"},{"id":4,"name":"name4"},{"id":2,"name":"name2"}]},{"name":"Melissa","item":[{"id":2,"name":"name2"}]}];
    
    const uniqueById = arr => Object.values(arr.reduce((r, o) => ({
      [o.id]: o,
      ...r
    }), {}));
    
    const result = data.map(o => ({
      ...o,
      item: uniqueById(o.item)
    }));
    
    console.log(result);

    【讨论】:

      【解决方案3】:

      你可以编写一个实用函数,然后像下面这样映射集合:

      var dedupeBy = (arr, by) =>
        Object.values(arr.reduce((a, item) => ({ ...a, [item[by]]: item }), {}));
      data.map((person) => ({ ...person, item: dedupeBy(person.item, 'name') }));
      

      【讨论】:

        猜你喜欢
        • 2021-08-26
        • 1970-01-01
        • 2019-10-26
        • 2020-12-31
        • 1970-01-01
        • 2021-10-31
        • 1970-01-01
        • 2022-12-05
        • 2018-01-08
        相关资源
        最近更新 更多