javascript删除重复项不起作用

时间:2019-11-22 18:27:16

标签: javascript arrays object

我想编写代码,该代码遍历数组并删除重复项。重复项在所有对象属性中都应具有相同的值。

我的数组如下:

[ { name: 'Romeo Minnock', semester: 12 },
  { name: 'Romeo Minnock', semester: 8 },
  { name: 'Gideon Heinemann', semester: 19 },
  { name: 'Gideon Heinemann', semester: 1 },
  { name: 'Gideon Heinemann', semester: 19 },
  { name: 'Gideon Heinemann', semester: 12 },
  { name: 'Brant Colegrove', semester: 3 },
  { name: 'Brant Colegrove', semester: 17 },
  { name: 'Gideon Heinemann', semester: 1 },
  { name: 'Gideon Heinemann', semester: 12 } ]

现在,我想删除姓名和学期中具有相同值的学生。 但是我的代码只是输出一个空数组,如下所示:[] 我的if条件有问题吗?

for( k = 0; k < sameNameStudent.length; k++){
    for( l = k + 1; l < sameNameStudent.length; l++){
        if(sameNameStudent[k].semester == sameNameStudent[l].semester){
            sameNameStudent.splice(sameNameStudent[l])
        }
    }
}    

console.log(sameNameStudent);

4 个答案:

答案 0 :(得分:1)

我将为此使用reduce函数:

const students = [ 
  { name: 'Romeo Minnock', semester: 12 },
  { name: 'Romeo Minnock', semester: 8 },
  { name: 'Gideon Heinemann', semester: 19 },
  { name: 'Gideon Heinemann', semester: 1 },
  { name: 'Gideon Heinemann', semester: 19 },
  { name: 'Gideon Heinemann', semester: 12 },
  { name: 'Brant Colegrove', semester: 3 },
  { name: 'Brant Colegrove', semester: 17 },
  { name: 'Gideon Heinemann', semester: 1 },
  { name: 'Gideon Heinemann', semester: 12 } 
]

students.reduce((list, current) => {
    // Check that the list does not contain this current value
    // if not push it to the array
    if (!list.find(s => s.name === current.name && s.semester === current.semester)) {
      list.push(current);
    }

    return list;
}, []);

答案 1 :(得分:1)

以下是一个可行的解决方案:https://stackoverflow.com/a/20339709/7919626

var sameNameStudent = [{
    name: 'Romeo Minnock',
    semester: 12
  },

  {
    name: 'Romeo Minnock',
    semester: 8
  },

  {
    name: 'Gideon Heinemann',
    semester: 19
  },

  {
    name: 'Gideon Heinemann',
    semester: 1
  },

  {
    name: 'Gideon Heinemann',
    semester: 19
  },

  {
    name: 'Gideon Heinemann',
    semester: 12
  },

  {
    name: 'Brant Colegrove',
    semester: 3
  },

  {
    name: 'Brant Colegrove',
    semester: 17
  },

  {
    name: 'Gideon Heinemann',
    semester: 1
  },

  {
    name: 'Gideon Heinemann',
    semester: 12
  }
];

function multiDimensionalUnique(arr) {
    var uniques = [];
    var itemsFound = {};
    for(var i = 0, l = arr.length; i < l; i++) {
        var stringified = JSON.stringify(arr[i]);
        if(itemsFound[stringified]) { continue; }
        uniques.push(arr[i]);
        itemsFound[stringified] = true;
    }
    return uniques;
}

console.log(multiDimensionalUnique(sameNameStudent));

答案 2 :(得分:0)

创建一个没有重复项的数组比在循环数组时删除重复项要容易得多。

将数组简化为Map,并使用一个基于对象值的键将Map.values()迭代器扩展回数组:

const data = [{"name":"Romeo Minnock","semester":12},{"name":"Romeo Minnock","semester":8},{"name":"Gideon Heinemann","semester":19},{"name":"Gideon Heinemann","semester":1},{"name":"Gideon Heinemann","semester":19},{"name":"Gideon Heinemann","semester":12},{"name":"Brant Colegrove","semester":3},{"name":"Brant Colegrove","semester":17},{"name":"Gideon Heinemann","semester":1},{"name":"Gideon Heinemann","semester":12}]

const result = [...
  data.reduce((m, o) => {
    const key = Object.values(o).join('--') // another option is JSON.stringify(o) if the object can have nested object values
    
    return m.has(key) ? m : m.set(key, o)
  }, new Map())
.values()]

console.log(result)

答案 3 :(得分:0)

您的算法无法正常工作的原因是,您似乎对splice的工作方式不够谨慎。

您不会像以前那样将数组元素传递给splice -至少将它传递开始(和/或加法)的第一个(最左边,最早的)元素的索引传递给它,以及(可选)要删除的元素数(或者将从您作为第一个参数传递的索引开始删除所有元素)。然后,所有后续参数都将作为要添加的元素,从删除的元素开始。

由于您显然要删除单个元素-如果您要像尝试对算法那样消除重复项,这将是您要执行的操作-在这种情况下,正确的表达式必须为{{1 }}。

即使更正了someNameStudent.splice(l, 1)的错误,您的比较谓词(用于确定元素之间是否相等的标准)也可能不够用-您仅比较splice属性的值- -难道您不暗示元素只有在 名称​​和学期相等时才重复吗?在这种情况下,您需要在semester语句中使用sameNameStudent[k].name == sameNameStudent[l].name && sameNameStudent[k].semester == sameNameStudent[l].semester作为表达式。