Удаление дублей в массиве
Помогите скриптом, который бы убирал дубли в массиве.
Массив представляет собой список фамилий и номеров их очередей. Если есть одинаковые фамилии, то повторные (с большим номером очереди) убрать из массива. Как следствие убрать соответствующий фамилии и номер очереди (с уменьшением номера оставшихся если появился пропуск в номерах). Возможные варианты и ожидаемый результат обработки 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, время: 13:29. |