Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Удаление дублей в массиве (https://javascript.ru/forum/misc/73871-udalenie-dublejj-v-massive.html)

ALARMus 24.05.2018 12:01

Удаление дублей в массиве
 
Помогите скриптом, который бы убирал дубли в массиве.
Массив представляет собой список фамилий и номеров их очередей.
Если есть одинаковые фамилии, то повторные (с большим номером очереди) убрать из массива. Как следствие убрать соответствующий фамилии и номер очереди (с уменьшением номера оставшихся если появился пропуск в номерах).
Возможные варианты и ожидаемый результат обработки

A,1,A,2,B,3,C,4 =-> A,1,B,2,C,3

A,1,B,2,A,2,C,3 =-> A,1,B,2,C,3

A,1,A,1,B,2,C,3 =-> A,1,B,2,C,3

A,1,B,2,A,3,C,4 =-> A,1,B,2,C,3

A,1,B,2,C,3,A,4 =-> A,1,B,2,C,3

Nexus 24.05.2018 12:09

Так?
const array='A,1,A,2,B,3,C,4'.split(',').filter(function(value, index, self) {
    return self.indexOf(value) === index;
});
alert(array.join(','));


upd. не так. Понял что нужно.

Alexandroppolus 24.05.2018 12:22

исходный массив может быть таким?
A,3,B,1

т.е. номера могут быть не по возрастанию?

(если исходно расположены по возрастанию, то можно решить более компактно и экономично. А если нет, то понадобится дополнительный массив объектов и его сортировка. Ну и, конечно, структура данных весьма спорная, массив объектов был бы удобнее)

ALARMus 24.05.2018 12:51

Цитата:

Сообщение от Alexandroppolus (Сообщение 485946)
исходный массив может быть таким?
A,3,B,1

т.е. номера могут быть не по возрастанию?

Нет - исходный массив таким не может быть. Последовательность отсортирована по номерам очереди и пропусков номеров изначально нет, есть разве что повторы номеров очереди. Но избавиться надо от дублей Фамилий.

рони 24.05.2018 13:00

ALARMus,
<script>
var array='A,1,A,2,B,3,C,4'.split(',');
function fn(array)
{
var res = [], n = 1, obj = {};
for (var i = 0; i < array.length; i+=2) {
    var f = array[i];
    if(!obj[f]){
       res.push(f, n++ );
       obj[f] = true;

    }
}
return res
}

document.write(JSON.stringify(fn(array)))
  </script>

Nexus 24.05.2018 13:02

var array='A,1,A,2,B,3,C,4'.replace(/\d+?/g,'').split(',').reduce(function(res,item,index,list){
	if(!!item && list.indexOf(item) === index)
		res.push(item,res.length/2+1);

	return res;
},[]);
alert(array.join(','));

Alexandroppolus 24.05.2018 13:08

function removeDoubles(src, target) {
  target = target || [];
  var names = Object.create(null);
  var pos = 0, qnum = 0;
  for (var i = 0, len = src.length; i < len; i += 2) {
    if (!names[src[i]]) {
      names[src[i]] = true;
      target[pos++] = src[i];
      target[pos++] = ++qnum;
    }
  }
  target.length = pos;
  return target;
}

var arr = 'A,1,B,2,C,3,A,4'.split(',');

alert(removeDoubles(arr).join(','));


если надо удалить дубли в исходном массиве, то removeDoubles(arr, arr)

ALARMus 24.05.2018 13:59

Спасибо.
Буду думать как теперь это адаптировать в свой javascript.

Потому как у меня не alert, а print. Массив задается так - var array = new Array("A,1,A,2,B,3,C,4") и запятые выискивать не надо, т.к. это разделены элементы массива, а не в виде строки показано значение...

Malleys 24.05.2018 14:48

Цитата:

Сообщение от ALARMus (Сообщение 485947)
Последовательность отсортирована по номерам очереди и пропусков номеров изначально нет, есть разве что повторы номеров очереди.

Тогда можно ещё так:
function normalize(order) {
	return Array.from(new Set(
		order
			.split(/,\d+(?:,|$)/)
			.slice(0, -1)),
		(s, i) => [s, i + 1].join(",")
	).join(",");
}

alert(normalize("A,1,A,2,B,3,C,4"));


Цитата:

Сообщение от ALARMus (Сообщение 485947)
var array = new Array("A,1,A,2,B,3,C,4")

Ну так это не массив в массиве, а строка в массиве.
normalize(array[0]);


Часовой пояс GMT +3, время: 10:35.