首页 > 解决方案 > JavaScript 对象数组:删除具有重复属性的对象。相同的条件有不同的输出

问题描述

如果年龄属性使用以下代码匹配,我正在尝试从数组中删除一个对象。

 var state= [
    {name: "Nityanand", age:23},
    {name: "Mohit", age:25},
    {name: "Nityanand", age:25}
  ]
  
  
 let a= [...state];
 var ids=[]

 var ar = a.filter(function(o) {
    
        if (ids.indexOf(o.age) !== -1){
        return false;
        }
        
        else if(ids.indexOf(o.age) === -1){
        ids.push(o);
        return true;}
})
console.log(ids)

    // OUTPUT: (NOT working fine)
    {name: "Nityanand", age:23},
    {name: "Mohit", age:25},
    {name: "Nityanand", age:25}

但是,如果我只通过在数组中推送一个属性来编辑代码,它就可以正常工作:

 var state= [
    {name: "Nityanand", age:23},
    {name: "Mohit", age:25},
    {name: "Nityanand", age:25}
  ]
  
  
 let a= [...state];
 var ids=[]

 var ar = a.filter(function(o) {
    
        if (ids.indexOf(o.age) !== -1){
        return false;
        }
        
        else if(ids.indexOf(o.age) === -1){
        ids.push(o.age); // Here i have edited the code by pushing only age property to the array
        return true;}
})
console.log(ids)

OUTPUT : [23, 25] // Only two items were added.

条件没有区别,但在第一个代码的输出中,在空数组中添加了 3 个项目,而在第二个代码中,只有 2 个项目被添加。这怎么可能?

标签: javascriptarraysobjectif-statementfilter

解决方案


在您的第一个示例中,您将整个对象放入数组ids中,但如果年龄存在,则尝试匹配indexOf- 那将不起作用。您永远不会找到具有age匹配属性的对象。您可以使用findIndex

var state = [{
    name: "Nityanand",
    age: 23
  },
  {
    name: "Mohit",
    age: 25
  },
  {
    name: "Nityanand",
    age: 25
  }
]


let a = [...state];
var ids = []

var ar = a.filter(function(o) {
  const idx = ids.findIndex(id => id.age == o.age);
  if (idx !== -1) {
    return false;
  } else if (idx === -1) {
    ids.push(o);
    return true;
  }
})
console.log(ids)


推荐阅读