如何从JavaScript数组中删除重复的对象

12

这是我的代码

var studentsList = [
    {"Id": "101", "name": "siva"},
    {"Id": "101", "name": "siva"},
    {"Id": "102", "name": "hari"},
    {"Id": "103", "name": "rajesh"},
    {"Id": "103", "name": "rajesh"},
    {"Id": "104", "name": "ramesh"},
];

function arrUnique(arr) {
    var cleaned = [];
    studentsList.forEach(function(itm) {
        var unique = true;
        cleaned.forEach(function(itm2) {
            if (_.isEqual(itm, itm2)) unique = false;
        });
        if (unique)  cleaned.push(itm);
    });
    return cleaned;
}

var uniqueStandards = arrUnique(studentsList);

document.body.innerHTML = '<pre>' + JSON.stringify(uniqueStandards, null, 4) + '</pre>';

输出

[
{
    "Id": "101",
    "name": "siva"
},
{
    "Id": "102",
    "name": "hari"
},
{
    "Id": "103",
    "name": "rajesh"
},
{
    "Id": "104",
    "name": "ramesh"
}
]

在以上代码中,我从JavaScript数组中获取了唯一的对象,但我想要删除重复的对象。所以我想要从数组中获取没有重复对象的输出,输出结果如下:
[ { "Id": "102", "name": "hari" }, { "Id": "104", "name": "ramesh" } ]

为什么你不使用lodash或underscore库? - huan feng
使用lodash可以提高生产效率:https://lodash.com/docs#uniq - long.luc
这与Angular有什么关系? - user663031
8个回答

17

请检查此内容

    var uniqueStandards = UniqueArraybyId(studentsList ,"id");

    function UniqueArraybyId(collection, keyname) {
              var output = [], 
                  keys = [];

              angular.forEach(collection, function(item) {
                  var key = item[keyname];
                  if(keys.indexOf(key) === -1) {
                      keys.push(key);
                      output.push(item);
                  }
              });
        return output;
   };

它接受大小写敏感性。它显示“Electronics”和“electronics”是不同的单词。 - reegan29

3
这可能是一个实现(不是最高效的),但能完成任务:
var studentsList = [
  {Id: "101", name: "siva"},
  {Id: "101", name: "siva"},
  {Id: "102", name: "hari"},
  {Id: "103", name: "rajesh"},
  {Id: "103", name: "rajesh"},
  {Id: "104", name: "ramesh"},
];

var ids = {};

studentsList.forEach(function (student) {
  ids[student.Id] = (ids[student.Id] || 0) + 1;
});

var output = [];
studentsList.forEach(function (student) {
  if (ids[student.Id] === 1) output.push(student);
});

console.log(output);

编辑:更快的方法如果学生按Id排序

var studentsList = [
  {Id: "101", name: "siva"},
  {Id: "101", name: "siva"},
  {Id: "102", name: "hari"},
  {Id: "103", name: "rajesh"},
  {Id: "103", name: "rajesh"},
  {Id: "104", name: "ramesh"},
];

var output = [];
studentsList.reduce(function (isDup, student, index) {
  var nextStudent = studentsList[index + 1];
  if (nextStudent && student.Id === nextStudent.Id) {
    return true;
  } else if (isDup) {
    return false;
  } else {
    output.push(student);
  }

  return false;
}, false);

console.log(output);

2
var unique = arr.filter(function(elem, index, self) {
    return index === self.indexOf(elem);
})

3
请在解释为什么这段代码有效时添加一些补充说明,以使答案更有用。 - Miguel Stevens

1
你可以使用JavaScript的filter方法:
上述问题的解决方案可以在this的小样中找到。 由于我们使用纯JavaScript,没有第三方开销,因此这种解决方案的性能会更好。
app.controller('myCntrl',function($scope){

    var seen = {};
    //You can filter based on Id or Name based on the requirement
    var uniqueStudents = studentsList.filter(function(item){
    if(seen.hasOwnProperty(item.Id)){
        return false;
    }else{
        seen[item.Id] = true;
        return true;
    }
});
    $scope.students = uniqueStudents;

});

如果您需要其他详细信息,请告诉我。


恐怕这正好不是他在寻找的。 - maxdec
@varun - 你的代码会返回一些唯一的对象,比如101、102、103、104,但我只想得到102和104。 - durga siva kishore mopuru

0

您可以使用库 lodash 和方法 uniqBy()


0
这样怎么样,两个不同的例子,第一个是通过比较属性而不是 Id 或整个对象来获取所有重复项。第二个例子是重复项的不同列表。

// Sample 1 - Show all duplicates of a particular code rather than the whole record is unique

var sampleJson = 
[
  { id: 1, code: "123-123" }, 
  { id: 2, code: "123-124" }, 
  { id: 3, code: "123-125" }, 
  { id: 4, code: "123-123" }
];

console.log("All duplicates");

let duplicates= [];

sampleJson.forEach(function (item) {
  var checkForDuplicates = sampleJson.filter(a => a.code == item.code);
  if (checkForDuplicates.length > 1) {
    duplicates .push(item);
  }
});
console.log(duplicates);
console.log( "Distinct duplicates");


// Sample 2 - Distinct list of duplicates
let distinctDuplicates= [];

sampleJson.forEach(function(item) {

  var checkForDuplicates = sampleJson.filter(a => a.code == item.code);
  if (checkForDuplicates.length > 1) {

    // Ensure we only have the single duplicate by ensuring we do not add the same one twice
    var exists = distinctDuplicates.filter(b => b.code == item.code).length == 1;
    if (false === exists) {
      distinctDuplicates.push(item);
    }
  }
});
console.log(distinctDuplicates);


0
这个一行代码的函数使用 Set() 怎么样?
function arrUnique(arr) { return [...new Set(arr.map(JSON.stringify))].map(JSON.parse);}

它使用JSON.stringify()JSON.parse()将对象转换为字符串,因为Set()的相等函数(===)不能自定义并且不适用于对象,而是适用于字符串。在字符串化版本中唯一元素的JSON.parse()将它们转换回对象。

很可能,由于使用JSON方法的开销,这不是最快的版本。


0
这是控制器,它将检测重复元素并删除它,并给出没有重复的元素。只需使用此控制器即可。
$scope.names= studentsList.reduce(function(array, place) {
         if (array.indexOf( studentsList.name) < 0) 
                array.push( studentsList.name );
         else
                array.splice(array.indexOf( studentsList.name), 1);
         return array;
}, []);

希望这对您有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接