问题 如何从angularjs中的JavaScript数组中删除重复的对象?


这是我的代码

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

1344
2017-09-07 07:05


起源

为什么你不使用lodash或下划线lib? - huan feng
使用 lodash 为了提高生产力: lodash.com/docs#uniq - long.luc
这与Angular有什么关系?


答案:


检查一下

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

11
2017-09-07 07:21



工作像CHAMP .. :)有什么方法我可以检查两个关键名称.... - Asad Ali Khan
它接受区分大小写。它显示“电子”和“电子”是不同的词。 - reegan29


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

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

3
2017-09-07 07:15



谢谢maxdec - durga siva kishore mopuru


你可以使用javascript filter 方法:

上述问题的解决方案可以在 这个 小提琴。 这个解决方案的性能会更好,因为我们使用的是纯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;

});

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


1
2017-09-07 07:19



我很害怕它正是他正在寻找的东西。 - maxdec
@varun - 你的代码将返回像101,102,103,104这样的独特对象,但我想获得102,104 - durga siva kishore mopuru


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

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

希望这适用于您的情况


0
2017-09-07 07:22