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

时间:2015-09-07 07:05:54

标签: javascript javascript-objects

这是我的代码



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>';
&#13;
&#13;
&#13;

输出

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

在上面的代码中,我从JavaScript数组中获取了唯一的对象,但我想删除重复的对象。所以我想从数组中获得没有重复的对象,输出就像     [     {         &#34; Id&#34;:&#34; 102&#34;,         &#34; name&#34;:&#34; hari&#34;     },     {         &#34; Id&#34;:&#34; 104&#34;,         &#34; name&#34;:&#34; ramesh&#34;     }     ]

7 个答案:

答案 0 :(得分:14)

检查

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

答案 1 :(得分: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 :(得分:1)

您可以使用javascript&#39; (function() { var backgroundColorPicker = document.getElementById('background_color_picker'); var highContrastCheckbox = document.getElementById('high_contrast_checkbox'); // Load any previously saved configuration, if available if(localStorage['high_contrast']) { highContrastCheckbox.checked = JSON.parse(localStorage['high_contrast']); backgroundColorPicker.value = localStorage['background_color']; } })(); 方法:

上述问题的解决方案可以在this小提琴中找到。 此解决方案的性能将更好,因为我们使用的是纯JavaScript,并且没有第三方开销。

filter

如果您需要任何其他详细信息,请与我们联系。

答案 3 :(得分:1)

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

答案 4 :(得分: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;
}, []);

希望这适合您的情况

答案 5 :(得分:0)

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

答案 6 :(得分:0)

这个使用 v1.someProto 的单行函数怎么样?

Set()

它使用 function arrUnique(arr) { return [...new Set(arr.map(JSON.stringify))].map(JSON.parse);} JSON.stringify() 将对象转换为字符串,因为 JSON.parse() (Set()) 的相等函数不可自定义且不适用于对象,但对于字符串。字符串化版本中的 === 唯一元素将它们转换回对象。

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