从数组中删除类似的对象

Remove similar objects from array

本文关键字:对象 删除 数组      更新时间:2023-09-26

我正在尝试从具有 4 个相同值和 1 个唯一值的数组中删除对象。

快速的谷歌搜索提供了很多选项,可以从数组中删除相同的对象,但不能删除相似的对象。

数组示例:

var data = [
   {Date: "2016-04-27T09:03:45Z", Name: "Tito", Title: "Developer", Department:"IT", Company: "XXX"},
   {Date: "2016-04-27T08:07:45Z", Name: "Tito", Title: "Developer", Department:"IT", Company: "XXX"},
   {Date: "2016-04-27T10:23:45Z", Name: "Tito", Title: "Developer", Department:"IT", Company: "XXX"}
]

我尝试使用 lodash _uniq函数,但它只需要一个属性即可匹配:

var non_duplidated_data = _.uniq(data, 'Name'); 

除日期外,所有值都相同。如何根据 4 个属性删除相同的对象?

您可以通过两个嵌套循环来执行此操作,这两个嵌套循环将针对自身迭代数组。

var newArray = [];   //Result array
//iterate
data.forEach(function(item, index){
    var found = false; 
    //Go through the rest of elements and see if any matches  
    for (var i = index; i < data.length, i++) {
        if (item.name == data[i].name && item.title == data[i].title) // add more fields here
            found = true;      
    }   
    //Add to the result array if no duplicates found
    if (!found)
       newArray.push(item);
})

你可以使用普通的Javascript来解决这个问题。只需检查每个属性的每个对象:

Array.prototype.allValuesSame = function() {
    for(var i = 1; i < this.length; i++) {
        if(this[i] !== this[0])
            return false;
    }
    return true;
}
var data = [
   {Date: "2016-04-27T09:03:45Z", Name: "Tito", Title: "Developer", Department:"IT", Company: "XXX"},
   {Date: "2016-04-27T08:07:45Z", Name: "Tito", Title: "Developer", Department:"IT", Company: "XXX"},
   {Date: "2016-04-27T10:23:45Z", Name: "Tito", Title: "Developer", Department:"IT", Company: "XXX"}
]
var tmpPropValues = {};
for (var property in data[0]) {
    tmpPropValues[property] = [];
    for(var i = 0; i < data.length; i++) {
        var obj = data[i];
    // store temporary in array
    if (obj.hasOwnProperty(property)) {
      var value = obj[property];
      tmpPropValues[property].push(value);
    }
  }
    if(tmpPropValues[property].allValuesSame()) {
      delete tmpPropValues[property];
  }
}
for(var prop in tmpPropValues) {
    var tmp = document.getElementById("result").innerHTML;
  document.getElementById("result").innerHTML = tmp+" "+prop;
}

我为你做了一个小提琴。

使用 .uniq通过 https://lodash.com/docs#uniqBy,它允许自定义条件来单q化你的数组。

这可以帮助您,在此代码中,我首先映射应比较的所有属性,然后减少数组以仅获取唯一记录。

 var data = [
       {Date: "2016-04-27T09:03:45Z", Name: "Tito", Title: "Developer", Department:"IT", Company: "XXX"},
       {Date: "2016-04-27T08:07:45Z", Name: "Tito", Title: "Developer", Department:"IT", Company: "XXX"},
       {Date: "2016-04-27T10:23:45Z", Name: "Tito", Title: "Developer", Department:"IT", Company: "XXX"}
    ];
var uniqueRecord = data.map(function(item){
    return {Name:item.Name,Title:item.Title,Department: item.Department,Company:item.Company};
}).reduce(function(acc,curr){
    if(!Array.isArray(acc)){
        var copyOfAcc = JSON.parse(JSON.stringify(acc));
        acc = [];
        acc.push(copyOfAcc);
    }
    return (acc.indexOf(curr) > -1) ? acc.push(curr) : acc;
});

结果将是:

[ { Name: 'Tito',
    Title: 'Developer',
    Department: 'IT',
    Company: 'XXX' } ]

然后,您需要定义要保留的日期(第一个,最后一个,哪个?)并再次找到记录,为此,一个简单的"forEach"应该可以工作。