Создайте массив и проверьте его - PullRequest
1 голос
/ 26 января 2011

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


Я посмотрел на ответ Шиме Видаса, и он, кажется, работает, но я попытался сократить его до

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;

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

Ответы [ 5 ]

5 голосов
/ 26 января 2011
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/

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

(Демонстрация 2 показывает, что число будет добавлено в массив только в том случае, если его еще нет в нем.)краткая форма этого:

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

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


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);
}
2 голосов
/ 26 января 2011

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

Вместо 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 голос
/ 26 января 2011

Вы можете расширить встроенный объект 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
1 голос
/ 26 января 2011

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

var arr = [];

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

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

1 голос
/ 26 января 2011
var array = []

array[0] = 'Item'

array[0] === undefined
# returns false

array[1] === undefined
# returns true
...