【问题标题】:How to remove objects with the same key and value pair in arrays如何删除数组中具有相同键值对的对象
【发布时间】:2018-12-07 21:21:46
【问题描述】:

我查看了许多堆栈溢出问题,但似乎没有一个能完全回答我的问题。我有一个对象数组,我想通过删除键和值相同的所有对象来减少它们。

所以我的对象数组是:

[{a:1},{a:2},{c:3},{b:1},{a:1},{c:3},{c:4},{a:1}]

最终结果应该是:

[{a:1},{a:2},{c:3},{b:1},{c:4}]

我尝试过使用 filer 和 map,但我只能获取数组中的第一个对象,而不是数组中具有不同键/值对的所有对象。我也尝试过使用 filter 和 findIndex,但遇到了同样的问题。

我也无法在将对象推入数组之前对其进行过滤。

有人能指出正确的方向吗?

【问题讨论】:

  • 看起来,所有对象都是独一无二的。
  • 怎么回事?在原始数组中,有三个对象都是 {a:1},还有两个是 {c:3}
  • @Teemu 我也看过那个,但是使用 filter 和 findIndex 的解决方案只返回唯一对象的第一个实例
  • @flored27,包含相同键和值的对象不相等;只有对同一对象的引用是相等的。这就是为什么{} !== {}
  • @Teemu 看起来接受的答案在将对象放入数组之前对其进行了过滤。但是,我已经有一个对象数组,无法预先过滤

标签: javascript arrays object filter


【解决方案1】:

您可以使用JSON.stringify() 比较这两个项目。然后我们使用reduce添加到一个新数组中,如果它在数组中我们不添加它,否则我们添加它。

const array = [{a:1},{a:2},{c:3},{b:1},{a:1},{c:3},{c:4},{a:1}]

let unique = array.reduce((res, itm) => {
  // Test if the item is already in the new array
  let result = res.find(item => JSON.stringify(item) == JSON.stringify(itm))
  // If not lets add it
  if(!result) return res.concat(itm)
  // If it is just return what we already have
  return res
}, [])

console.log(unique)

或者,您可以使用Set(作为 Fissure King 提及)来制作一个独特的项目列表,如下所示:

const array = [{a:1},{a:2},{c:3},{b:1},{a:1},{c:3},{c:4},{a:1}]

let unique = [...new Set(array.map(itm => JSON.stringify(itm)))].map(i => JSON.parse(i))

console.log(unique)

【讨论】:

  • 或者,但同样的:[...new Set(array.map((item) => JSON.stringify(item))]
  • 没想到一套!我喜欢!
  • 我真的很喜欢这个答案!你有什么办法可以向我解释为什么...新的?
  • 因为Setclass,我们需要创建该类的实例。
  • 如果您的意思是...,即Spread Syntax
【解决方案2】:
var a = [{a:1},{a:2},{c:3},{b:1},{a:1},{c:3},{c:4},{a:1}];
var newData = [];
a.map(ele=>JSON.stringify(ele)).forEach(ele=>{
   if(newData.indexOf(ele) === -1){
     newData.push(ele)
   }
});
newData.map(ele=>JSON.parse(ele))
console.log(newData);

【讨论】:

    【解决方案3】:

    假设您所有的对象都是不同类型(不同的属性)并且本质上并不复杂,即不是嵌套对象..

    1. 创建一个数组列表(它将作为多维数组)。

      让 uniqueArr = [];

    2. 使用 Arr.forEach() 遍历包含重复项的数组;

    3. 获取对象的属性

      Object.getPropertyNames(item);

    4. 检查这种类型的对象类型是否已经存在于你的 uniqueArr 中,如果没有添加属性类型。

      uniqueArr.push({property:[]});

    5. 如果uniqueArr中已经存在该属性,则检查当前属性值是否存在于uniqueArr内的属性数组中。

    6. 如果属性不存在,则将新属性添加到相应的属性数组中。如果属性退出,则跳过并为下一个对象运行循环。

    7. 循环完成后,在 uniqueArr 的帮助下创建 resultArr。

      示例 uniqueArr [ {a:[1,2]}, {b:[1]}, {c:[3]} ]

    【讨论】:

      【解决方案4】:

      假设您所有的对象都是不同类型(不同的属性)并且本质上并不复杂,即不是嵌套对象..

      1. 创建一个数组列表(它将作为多维数组)。

        让 uniqueArr = [];

      2. 遍历包含Arr.forEach(); 重复项的数组

      3. 使用

        获取对象的属性

        Object.getPropertyNames(item);

      4. 检查此类型的对象类型是否已存在于您的 uniqueArr 中,如果没有添加属性类型。

      uniqueArr.push({property:[]});

      1. 如果uniqueArr中已经存在该属性,则检查当前属性值是否存在于uniqueArr内的属性数组中。
      2. 如果该属性不存在,则将新属性添加到相应的属性数组中。如果该属性退出,则跳过并为下一个对象运行循环。
      3. 一旦循环完成,在 uniqueArr。

      示例:uniqueArr [ {a:[1,2]}, {b:[1]}, {c:[3]} ];

      【讨论】:

        猜你喜欢
        • 2021-10-26
        • 2020-06-12
        • 2021-06-07
        • 2019-03-29
        • 2022-06-10
        • 1970-01-01
        • 2022-01-11
        • 2019-11-03
        • 1970-01-01
        相关资源
        最近更新 更多