2011-01-26 5 views
1

Я не уверен, как это сделать, но что я хочу сделать, создайте массив и сможете добавлять новые элементы в этот массив. Так как элементы должны быть случайным числом, когда создается новый экземпляр, я бы хотел, чтобы он был проверен на остальную часть массива, и убедитесь, что номер, который он сгенерировал, еще не находится в массиве. Как я мог бы сделать что-то подобное?Создайте массив и отметьте его


Я посмотрел на ответ Šime Vidas, и это, кажется, работает, но я старался сократить его

var arr = []; 

function add(a) { 
var n = ~~(Math.random() * 100); 
for (var i = 0; i < a.length; i++) { 
    if (a[i] === n) { a.push(n) } 
} 

} 

for (var i=0; i<5; i++){ 
    add(arr) 
} 

document.getElementById('output').innerHTML += arr; 

, и я не понимаю, почему это не будет работать. Это почти то же самое, правильно?

+1

Удаленный ответ предложил использовать объекты как datastrucure. Почему он был удален? Мне кажется хорошей идеей. Он избегает циклизации массива. –

+0

Я согласен с @Felix. Пока исходный порядок не важен, и фактический массив не является обязательным требованием, использование объекта для этого было бы чрезвычайно простым. – user113716

ответ

5
var arr = []; 

function add(a) { 
    var n = ~~(Math.random() * 1000); 
    !is(a, n) && a.push(n); 
} 

function is(a, n) { 
    for (var i = 0; i < a.length; i++) { 
     if (a[i] === n) { return true; } 
    } 
    return false; 
} 

add функция создает случайное целое число в диапазоне от 0 до 1000, и добавляет его в массив.
Функция is проверяет, находится ли номер n внутри массива a.

Демо:http://jsfiddle.net/kHhMp/2/

Demo 2:http://jsfiddle.net/kHhMp/3/

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


btw

!is(a, n) && a.push(n); 

является краткой формой этого:

if (is(a, n) == false) { a.push(n); } 

Число добавляется в массив, только если is(a, n) возвращает ложь.


UPDATE

var arr = []; 

function add(a) { 
    var n = ~~(Math.random() * 1000), 
     ok = true; 

    for (var i = 0; i < a.length; i++) { 
     if (a[i] === n) { ok = false; } 
    } 

    ok && a.push(n); 
} 
+0

Я не могу сказать, хочет ли OP тот факт, что номер фактически генерируется случайным образом или если он получает номера в другом месте. Кроме того, это безумно трудно читать, если вам нужно вернуться к этому коду позже. – Jason

+0

@Jason Что именно трудно читать? Функция 'is' так же прямолинейна, как и получается. Функция 'add' использует' ~~ 'и' && ', которые трудно понять, только если вы их не понимаете (очевидно). Если вы их понимаете, вы можете читать через функцию довольно быстро, я верю. –

+0

@Jason Yea, я думаю, что OP получает номера в другом месте. Посмотрим, что он скажет ... –

1
var array = [] 

array[0] = 'Item' 

array[0] === undefined 
# returns false 

array[1] === undefined 
# returns true 
+0

Как работает '' 'по производительности на массивах? Я мог представить, что объект будет лучше. –

+0

@ Феликс: понятия не имею. Я думаю, что это может быть ужасная идея использовать его в любом случае - я думаю, что он проверяет свойства объекта, а не просто индексы массива. –

+1

@Felix 'in' ищет свойства и будет пересекать цепочку прототипов, это медленный и возможный багги. @Paul Вы должны использовать strict equals '===' иначе '(array [0] = null) == undefined' будет' true'. –

1

Самый быстрый, самый кросс-браузер способ для перебора массива с помощью цикла:

var arr = []; 

function addNum(num) { 
    for (i = 0, len = arr.length; i < len; i++) { 
     if (arr[i] === num) { return false; } 
    } 
    arr.push(num); 
} 

Будьте уверены, чтобы получить длину массива, прежде чем запустить цикл так, свойства длины не проверяется постоянно.

+1

Не забудьте увеличить «i» ... –

+0

+1 Надеюсь, вы не возражаете мне переформатировать код немного ':)' –

2

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

Вместо того, чтобы делать var my_array=[]; my_array.push(my_number), используйте var my_object = {}; my_object[my_number] = true, чтобы добавить элементы в свою структуру.

При таком подходе, вы можете легко проверить, если новый номер уже там с if (my_object[my_number]) { /* already there */ } else { /* not there yet */ }

После того, как вы закончите, вы можете извлечь список чисел в массиве с помощью либо с помощью var keys = Object.keys(my_object), или если это не доступно, var keys=[],i=0;for (keys[i++] in my_object);, более или менее.

1

Вы можете расширить встроенный объект Array для ваших нужд.

Array.prototype.pushUnique = function(value) { 
    var len = this.length; 
    for(var i = 0; i < len; i++) { 
    if(this[i]===value) return; 
    } 
    this.push(value); 
} 

var uniques = new Array(); 
uniques.pushUnique(1); 
uniques.pushUnique(2); 
uniques.pushUnique(1); 
// array will contain only 1 and 2 
+0

'var i' или' i' протекает в глобальном масштабе. – Thai

+0

Спасибо @Thai, отредактировал код, чтобы исправить это. – mhitza

Смежные вопросы