如何删除数组中具有相同键和值对的对象

时间:2018-06-28 17:52:28

标签: javascript arrays object filter

我已经研究了许多堆栈溢出问题,但是似乎没有一个问题能完全回答我的问题。我有一个对象数组,我想通过删除键和值相同的所有对象来减少这些对象。

所以我的对象数组是:

[{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}]

我尝试使用文件管理器和映射,但是我只能获取数组中的第一个对象,而不能获取数组中具有不同键/值对的所有对象。我也尝试过使用filter和findIndex,但是有同样的问题。

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

有人可以指出我正确的方向吗?

4 个答案:

答案 0 :(得分:3)

您可以使用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(作为“裂隙之王”的陨石)来制作类似这样的物品的唯一列表:

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)

答案 1 :(得分:0)

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

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

    let 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]} ]

答案 2 :(得分:0)

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

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

    let uniqueArr = [];

  2. 遍历数组,其中包含与Arr.forEach();

  3. 相同的重复项
  4. 使用

    获取对象的属性

    Object.getPropertyNames(item);

  5. 如果未添加属性类型,请检查您的uniqueArr中是否已经存在这种类型的对象。

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

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

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

答案 3 :(得分:-1)

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);