【问题标题】:How to remove duplicate objects from JavaScript array如何从 JavaScript 数组中删除重复的对象
【发布时间】:2021-12-30 08:05:57
【问题描述】:

这是我的代码

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 数组中获得了唯一的对象,但我想删除重复的对象。所以我想从数组中得到没有重复的对象,输出像 [ { “身份证”:“102”, “名称”:“哈里” }, { “身份证”:“104”, “名称”:“拉梅什” } ]

【问题讨论】:

  • 为什么不使用 lodash 或下划线库?
  • 使用lodash 提高生产力:lodash.com/docs#uniq
  • 这和 Angular 有什么关系?

标签: javascript javascript-objects


【解决方案1】:

这可能吗? (不是最高效的实现,但可以完成工作):

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】:

    你可以使用javascript的filter方法:

    以上问题的解决方法可以在thisfiddle找到。 这个方案的性能会更好,因为我们使用的是纯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;
    
    });
    

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

    【讨论】:

    • 我担心这不是他想要的。
    • @varun - 您的代码将返回唯一对象,例如 101,102,103,104,但我想获得 102,104
    【解决方案3】:

    检查一下

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

    【讨论】:

    • 它接受区分大小写。它表明“电子”和“电子”是不同的词。
    【解决方案4】:

    这是一个控制器,它将检测重复元素并将其删除,并为您提供没有重复元素的元素。只需使用此控制器

    $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;
    }, []);
    

    希望这适用于您的情况

    【讨论】:

      【解决方案5】:
      var unique = arr.filter(function(elem, index, self) {
          return index === self.indexOf(elem);
      })
      

      【讨论】:

      • 请添加更多解释为什么此代码有效,所以这是一个更有用的答案。
      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

        这个使用Set()的单行函数怎么样?

        function arrUnique(arr) { return [...new Set(arr.map(JSON.stringify))].map(JSON.parse);}
        

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

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

        【讨论】:

          猜你喜欢
          • 2016-09-24
          • 2018-08-15
          • 1970-01-01
          • 2014-06-25
          • 1970-01-01
          • 2021-12-07
          • 1970-01-01
          • 2018-06-19
          相关资源
          最近更新 更多