Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   повторения в массиве (https://javascript.ru/forum/misc/33856-povtoreniya-v-massive.html)

deeputy 11.12.2012 13:40

повторения в массиве
 
Добрый день, друзья, ни разу не обращался сюда за помощью, но этот момент таки настал, смотрите, имеем две функции, одна для записи в массив, данных вторая для считывания из массива, если с пробежками по массиву никаких проблем нет, то с записью мне нужна помощь, проблема в следующем, ах да простите, вот код:

function readhistory() {

for(var n in back) { alert(back[n]); }
n++;
alert('всего '+n);

}

function writehistory(f) {

for(var n in back) { }

if (back[0]) {
back[++n] = f;
} else {
back[0] = f;
}

}


так вот о проблеме, когда передаем в функцию writehistory(f) поочередно несколько параметров путем многократного запуска функции, например сначала "А" потом "B" потом "С", то в массиве видим следующее "A,B,B,C,C,C,C" аж семь элементов, и с каждым вызовом функции writehistory(f) получаем удвоение, если за предыдущими действиями отправить в функцию "D" то получим "A,B,B,C,C,C,C,D,D,D,D,D,D,D,D" и так далее, как побороть этот недуг? почему так происходит? будьте добры, помогите понять.

Hoshinokoe 11.12.2012 14:24

deeputy,

Попробуй так:
var back = [];
function read_history()
{
    for (var i = 0; i < back.length; i++)
    {
        alert(back[i]);
    }
    alert("Total " + back.length);
}
function write_history(data) {
    back.push(data);     // метод push добавляет элемент в конец массива
}

deeputy 11.12.2012 14:35

Hoshinokoe, нет, так я уже тоже пытался сделать, так и так в итоге видим удвоение каждой последующей записи.
p.s. back.push(); добавляет, но суть как раз в том что каким бы образом я не добавлял в конец массива что-то новое, каким то образом вместо одной записи в конец массива попадает вдвое больше одинаковых записей от предыдущего значения.

ОлегА 11.12.2012 14:51

когда вы вызывается 1-ый раз функцию writehistory у вас back заполняется данными, но когда вы вызываете ее еще раз, то back уже существует и данные в нем есть и он еще раз дополняется теми данными которые уже есть у вас, потому что вы его в цикле крутите

нужно делать проверку, если в back уже есть такое значение, то делать continue например

ОлегА 11.12.2012 14:54

можно сделать так

function writehistory(f) {
 
 if (back[0] !== undefined) {
    back.push(f);
 } else {
    back[0] = f;
 }
}

deeputy 11.12.2012 15:43

Прошу прощения за свою глупость:), код размером в полторы тысячи строк пришлось по полочкам разобрать, в итоге нашел где собака спрятана, в замыканиях, одна функция вызывала другую, та в свою очередь зависела от третьей:blink: , вот вся эта катавасия игнорировала условия, точнее не игнорировала а применяла размноженное значение что приводило к штампованию значений, я то уже думал с ума сойду почему не работает то что по определению сломаться не может.

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


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