Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Arr.push() и for...in (затирает предыдущие элементы) (https://javascript.ru/forum/misc/65375-arr-push-i-zatiraet-predydushhie-ehlementy.html)

Benos 15.10.2016 12:39

Arr.push() и for...in (затирает предыдущие элементы)
 
Добрый день!
Возник какой то косяк с Arr.push() и for ... in.
var sysData = { 
        		   "53733202":["53733202",["5800", "203"]],
        		   "53990478":["53990478",["5800", "203"]]
       		  };
                  
var bodyArrJSON = [];
var sesID = 111;

goGo();

function getBody(){
      var bodyTMP = {};
      var ctrl = 'ID';
      var act =  'addItem';
      bodyArrJSON[1] = [];
      bodyArrJSON[0] = '/api/?c='+ctrl+'&a='+act+'&t';
      for(bodyKey in sysData){
          bodyTMP.list = sysData[bodyKey][1];  
          bodyTMP.itemId = sysData[bodyKey][0];
          bodyArrJSON[1].push({ controller: ctrl, action: act, params: bodyTMP, session: sesID });
          alert("Тело[i] => "+JSON.stringify(bodyArrJSON[1]));
      }
      alert("Общее тело => "+JSON.stringify(bodyArrJSON[1]));
}


function goGo(){
  alert("Исходное тело => "+JSON.stringify(sysData));
  getBody();
}


собственно есть объект с данными sysData(в реальных условиях динамический - количество элементов любое). Из этих данных собираю тело JSON запроса. Причем собираю их во временный массив, что бы в дальнейшем последовательным перебором посылать POST запросы(одна строка, один запрос).

временный массив с телами запрос имеет вид:
bodyArrJSON = ['элемент URL', ['тело1', 'тело2', 'телоN']];


По идеи должно на выходе быть так:
bodyArrJSON = [
 '/api/?c=ID&a=addItem&t', 
 [{"controller": "ID", "action": "addItem", "params": { "list": ["5800", "203"], "itemId": "53733202" , "session": "111"},
  {"controller": "ID", "action": "addItem", "params": { "list": ["5800", "203"], "itemId": "53990478" , "session": "111"}]
];

по факту слушающий элемент затирает предыдущие и в итоговом массиве идут одинаковые элементы.
https://jsfiddle.net/Benos/yfhqmkn6/

Подскажите пожалуйста в чем дело. Что то в голову не приходят другие варианты перебора...
если только for (i=0; i<...;i++) с последующим bodyArrJSON[1][i] = ... но как то громоздко выходит :(

warren buffet 15.10.2016 12:44

Цитата:

Сообщение от Benos
bodyArrJSON[1] = [];


При чем тогда push? При каждом вызове переменная инициализируется. Ну, не переменная, переменная элемент массива, но ты ж его именно чекаешь в алерте.

Может быть и не оно, но у тебя какие-то загадочные кустарные заморочки, одному тебе известные видимо, поскольку с ТЗ код не совпадает.

Benos 15.10.2016 12:53

Вопрос снят... косяк нашел
обнуление объекта тела bodyTMP в цикл перебора.
function getBody(){
      var ctrl = 'ID';
      var act =  'addItem';
      bodyArrJSON[1] = [];
      bodyArrJSON[0] = '/api/?c='+ctrl+'&a='+act+'&t';
      for(bodyKey in sysData){
          var bodyTMP = {};
          bodyTMP.list = sysData[bodyKey][1];  
          bodyTMP.itemId = sysData[bodyKey][0];
          bodyArrJSON[1].push({ contr: ctrl, act: act, pars: bodyTMP, session: sesID });
          alert("Тело[i] => "+JSON.stringify(bodyArrJSON[1]));
      }
      alert("Общее тело => "+JSON.stringify(bodyArrJSON[1]));
}


три дня сидел... разные варианты перебирал... :)

Benos 15.10.2016 12:57

warren buffet,
инициируется при первом вызове функции getBody()
так как sysData подгружается с сервера (динамически) что бы не было "хвостов" специально обнуляю bodyArrJSON[1] = [];

warren buffet 16.10.2016 14:53

Кажется понял откуда куст растет. Ты кустарно делаешь json.


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