24.05.2018, 12:01
|
Новичок на форуме
|
|
Регистрация: 06.01.2012
Сообщений: 3
|
|
Удаление дублей в массиве
Помогите скриптом, который бы убирал дубли в массиве.
Массив представляет собой список фамилий и номеров их очередей.
Если есть одинаковые фамилии, то повторные (с большим номером очереди) убрать из массива. Как следствие убрать соответствующий фамилии и номер очереди (с уменьшением номера оставшихся если появился пропуск в номерах).
Возможные варианты и ожидаемый результат обработки
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
Последний раз редактировалось ALARMus, 24.05.2018 в 12:04.
|
|
24.05.2018, 12:09
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,796
|
|
Так?
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. не так. Понял что нужно.
Последний раз редактировалось Nexus, 24.05.2018 в 12:46.
|
|
24.05.2018, 12:22
|
|
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
исходный массив может быть таким?
A,3,B,1
т.е. номера могут быть не по возрастанию?
(если исходно расположены по возрастанию, то можно решить более компактно и экономично. А если нет, то понадобится дополнительный массив объектов и его сортировка. Ну и, конечно, структура данных весьма спорная, массив объектов был бы удобнее)
Последний раз редактировалось Alexandroppolus, 24.05.2018 в 12:29.
|
|
24.05.2018, 12:51
|
Новичок на форуме
|
|
Регистрация: 06.01.2012
Сообщений: 3
|
|
Сообщение от Alexandroppolus
|
исходный массив может быть таким?
A,3,B,1
т.е. номера могут быть не по возрастанию?
|
Нет - исходный массив таким не может быть. Последовательность отсортирована по номерам очереди и пропусков номеров изначально нет, есть разве что повторы номеров очереди. Но избавиться надо от дублей Фамилий.
Последний раз редактировалось ALARMus, 24.05.2018 в 13:01.
|
|
24.05.2018, 13:00
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,127
|
|
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>
|
|
24.05.2018, 13:02
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,796
|
|
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(','));
|
|
24.05.2018, 13:08
|
|
Профессор
|
|
Регистрация: 25.10.2016
Сообщений: 1,012
|
|
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)
|
|
24.05.2018, 13:59
|
Новичок на форуме
|
|
Регистрация: 06.01.2012
Сообщений: 3
|
|
Спасибо.
Буду думать как теперь это адаптировать в свой javascript.
Потому как у меня не alert, а print. Массив задается так - var array = new Array("A,1,A,2,B,3,C,4") и запятые выискивать не надо, т.к. это разделены элементы массива, а не в виде строки показано значение...
Последний раз редактировалось ALARMus, 24.05.2018 в 14:19.
|
|
24.05.2018, 14:48
|
|
Профессор
|
|
Регистрация: 20.12.2009
Сообщений: 1,714
|
|
Сообщение от ALARMus
|
Последовательность отсортирована по номерам очереди и пропусков номеров изначально нет, есть разве что повторы номеров очереди.
|
Тогда можно ещё так:
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
|
var array = new Array("A,1,A,2,B,3,C,4")
|
Ну так это не массив в массиве, а строка в массиве.
normalize(array[0]);
Последний раз редактировалось Malleys, 24.05.2018 в 14:57.
|
|
|
|