Удаление дублей в массиве
Помогите скриптом, который бы убирал дубли в массиве.
Массив представляет собой список фамилий и номеров их очередей. Если есть одинаковые фамилии, то повторные (с большим номером очереди) убрать из массива. Как следствие убрать соответствующий фамилии и номер очереди (с уменьшением номера оставшихся если появился пропуск в номерах). Возможные варианты и ожидаемый результат обработки 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 |
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. не так. Понял что нужно. |
исходный массив может быть таким?
A,3,B,1 т.е. номера могут быть не по возрастанию? (если исходно расположены по возрастанию, то можно решить более компактно и экономично. А если нет, то понадобится дополнительный массив объектов и его сортировка. Ну и, конечно, структура данных весьма спорная, массив объектов был бы удобнее) |
Цитата:
|
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>
|
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(','));
|
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) |
Спасибо.
Буду думать как теперь это адаптировать в свой javascript. Потому как у меня не alert, а print. Массив задается так - var array = new Array("A,1,A,2,B,3,C,4") и запятые выискивать не надо, т.к. это разделены элементы массива, а не в виде строки показано значение... |
Цитата:
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"));
Цитата:
normalize(array[0]); |
| Часовой пояс GMT +3, время: 14:59. |