Как удалить дубликаты из массива объектов с несколькими свойствами как уникальных? - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть массив под jQuery, как показано ниже.

var originalArray=[
   {ID: "01", PID: "1111", Week: "Week1"},
   {ID: "02", PID: "2222", Week: "Week1"},
   {ID: "03", PID: "3333", Week: "Week1"},
   {ID: "04", PID: "4444", Week: "Week1"},
   {ID: "05", PID: "1111", Week: "Week1"}, //Duplicate entry like ID 01

   {ID: "06", PID: "1111", Week: "Week2"},
   {ID: "07", PID: "2222", Week: "Week2"},
   {ID: "08", PID: "3333", Week: "Week2"},
   {ID: "09", PID: "4444", Week: "Week2"},
   {ID: "10", PID: "1111", Week: "Week2"}, //Duplicate entry like ID 06

   {ID: "11", PID: "1111", Week: "Week3"},
   {ID: "12", PID: "2222", Week: "Week3"},
   {ID: "13", PID: "3333", Week: "Week3"},
   {ID: "14", PID: "4444", Week: "Week3"},
   {ID: "15", PID: "2222", Week: "Week3"}, //Duplicate entry like ID 11

   {ID: "16", PID: "1111", Week: "Week4"},
   {ID: "17", PID: "2222", Week: "Week4"},
   {ID: "18", PID: "3333", Week: "Week4"},
   {ID: "19", PID: "4444", Week: "Week4"},
   {ID: "20", PID: "4444", Week: "Week4"}  //Duplicate entry like ID 19
];

Теперь мне нужны все записи с комбинацией только свойств"PID" и "Week" как дубликат, который будет удален. Для более подробного объяснения следующие записи должны быть удалены.

  • Запись с идентификатором "05" -> PID "1111" и неделя "Week1" совпадает с идентификатором "01"
  • Запись с идентификатором «10» -> PID «1111» и неделя «Week2» совпадает с идентификатором «06»
  • Запись с идентификатором «15» -> PID «2222» и неделя «Week3» идентично идентификатору "11"
  • Запись с идентификатором "20" -> PID "4444" и неделя "Week4" совпадает с идентификатором "19"

Это то, что я пробовал до сих пор:

//Array declaration
var originalArray=[
   {ID: "01", PID: "1111", Week: "Week1"},
   {ID: "02", PID: "2222", Week: "Week1"},
   {ID: "03", PID: "3333", Week: "Week1"},
   {ID: "04", PID: "4444", Week: "Week1"},
   {ID: "05", PID: "1111", Week: "Week1"}, //Duplicate entry like ID 01
   
   {ID: "06", PID: "1111", Week: "Week2"},
   {ID: "07", PID: "2222", Week: "Week2"},
   {ID: "08", PID: "3333", Week: "Week2"},
   {ID: "09", PID: "4444", Week: "Week2"},
   {ID: "10", PID: "1111", Week: "Week2"}, //Duplicate entry like ID 06
   
   {ID: "11", PID: "1111", Week: "Week3"},
   {ID: "12", PID: "2222", Week: "Week3"},
   {ID: "13", PID: "3333", Week: "Week3"},
   {ID: "14", PID: "4444", Week: "Week3"},
   {ID: "15", PID: "2222", Week: "Week3"}, //Duplicate entry like ID 11
   
   {ID: "16", PID: "1111", Week: "Week4"},
   {ID: "17", PID: "2222", Week: "Week4"},
   {ID: "18", PID: "3333", Week: "Week4"},
   {ID: "19", PID: "4444", Week: "Week4"},
   {ID: "20", PID: "4444", Week: "Week4"}  //Duplicate entry like ID 19
];

var result = [];
var tempArr = [];

	$.each(originalArray, function (index, entry) {
		if (!(tempArr[entry.PID] && tempArr[entry.Week])) {
			tempArr[entry.PID] = true;
			tempArr[entry.Week] = true;
			result.push(entry);
		}
	});

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

С помощью приведенного выше кода я думаю, что он проверяет только первый PID свойства, но не второе свойство Week. Я также пробовал ссылки ниже, но вряд ли мог найти какую-либо помощь.

Дубликаты в массиве объектов Как удалить дубликаты ОБЪЕКТОВ из JavaScript массива? Удалить дубликаты из массива объектов - Javascript JavaScript Array Distinct ()

Заранее спасибо.

1 Ответ

1 голос
/ 13 апреля 2020

Вы можете поместить свой собственный лог c для проверки на наличие дубликатов в отдельную функцию, а затем повторять исходный массив и копировать записи только тогда, когда они не являются дубликатами.

function isDuplicate(entry, arr) {
  return arr.some(x => (entry.PID == x.PID) && (entry.Week == x.Week))
}

let newArray = []
for (const entry of originalArray) {
  if (!isDuplicate(entry, newArray)) { newArray.push(entry) }
}
...