我想编写代码,该代码遍历数组并删除重复项。重复项在所有对象属性中都应具有相同的值。
我的数组如下:
[ { 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);
答案 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
作为表达式。