Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Сделать все элементы массива уникальными (https://javascript.ru/forum/misc/9636-sdelat-vse-ehlementy-massiva-unikalnymi.html)

exec 28.05.2010 17:27

Сделать все элементы массива уникальными
 
Есть массив с 10 элементами, содержащими числа от 0 до 20. Надо сделать так, чтобы не было одинаковых элементов, чтобы они заменились на любое другое число (от 0 до 20). Ума не приложу, как это сделать.

Готовый код не нужен, просто подкиньте алгоритм, как это всё организовать.

micscr 28.05.2010 17:40

Код:

WhoIs = {}
цикл по элементам
  if (WhoIs[текущее значение]) меняем на уникальное и обновляем WhoIs.
  WhoIs[текущее значение] = 'занято';
end цикл по элементам

меняем на уникальное - с помощью отдельной функции - она его найдет учитывая WhoIs

рони 29.05.2010 14:20

а если сразу формировать массив с уникальными элементами ? чтоб его потом не проверять на повторы

exec 29.05.2010 14:43

рони, тогда массив станет меньше. А если добавить в него рандомное число, оно может совпасть с каким-нибудь оставшимся в массиве числом.

micscr, а причём тут хэш?

micscr 29.05.2010 14:46

Цитата:

Сообщение от exec (Сообщение 56964)
micscr, а причём тут хэш?

что за хэш ?

exec 29.05.2010 14:52

Цитата:

WhoIs = {}
Вот.

exec 29.05.2010 14:54

-------------

Есть вариант — напустить на массив array_unique, потом, пока массив не примет прежний размер, добавлять в него рандомные числа, предварительно проверяя, не нахоятся ли они уже внутри него. Но порядок чисел должен сохраняться, поэтому это не подходит.

micscr 29.05.2010 15:10

Цитата:

Сообщение от exec (Сообщение 56968)
Вот.

это вспомогательный объект - в его свойствах будут содержаться уже присутствующие элементы.

рони 29.05.2010 15:23

функция формирования массива с уникальными данными с заданной длиной и диапазоном
<script language="JavaScript" type="text/javascript">
function random(min,max,l)
{var arr = [],m = [],n = 0;
  if (max - min < l-1) return;
  for (var i=0; i<=(max-min); i++)m[i] = i + min;
  for (var i=0; i<l; i++) {n = Math.floor(Math.random()*(m.length)); arr[i]=m.splice(n,1)[0];};
  return arr
}
document.write(JSON.stringify(random(0,20,10)))
</script>

рони 29.05.2010 15:24

вариант отлова на скорую руку
<script language="JavaScript" type="text/javascript">
function usefloor(min, max) {
    return Math.floor(Math.random() * (max - min + 1) + min);
}
var m = [],
    s = [],
    t = [];
var l = 10; //длина массива
var min = 0;
var max = 20;
//создание массива m с неуникальными элементами
for (var i = 0; i < l; i++) {
    m[i] = usefloor(min, max)
}
var test="<br>" + m;
//создание массива t из оставшихся элементов на случай замены
for (var i = 0; i <= (max - min); i++) {
    s[i] = 1;
}
for (var i = 0; i < l; i++) {
    s[m[i]] = 0;
}
for (var i = 0; i < s.length; i++) {
    if (s[i] == 1) t.push(i)
}
test+="<br>" + t;
//проверка m на уникальность и замена повторяющихся элементов
for (var i = 0; i < l; i++) {
    for (var k = i + 1; k < l; k++) {
        if (m[k] == m[i]) {
            n = usefloor(0, (t.length - 1));
            m[k] = "<font color='#FF0000'>" + t[n] + "</font>";
            t.splice(n, 1);
        }
    }
}
document.write(test+"<br>" + m);
</script>


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