Приложение каким-то образом записывает нежелательные параметры в объект

#javascript #jquery #arrays #json #object

#javascript #jquery #массивы #json #объект

Вопрос:

У меня есть две функции. Оба они принимают массивный объект JSON, и один из них изменяет его на формат:

 [{ date: 'date', count_0: '10' },
 { date: 'date', count_0: '10' }]
  

Другая функция изменяет объект JSON в этот формат:

 [{ date: 'date', count_0: '10', count_1: '20', count_2: '30' ... },
 { date: 'date', count_0: '10', count_1: '20', count_2: '30' ... }]
  

Вот странная часть. Я вызываю только первую функцию, но моя программа пытается создать формат второй функции.

Другая функция есть в моем коде, но я знаю, что она не вызывается, потому что у меня есть несколько alert функций внутри него, которые не запускаются.

Вот разъяснение, чтобы прояснить мою проблему.Ниже приведена первая функция… куча (for... in) мусора и условных операторов:

 function firstFunction(data, sort, campaign) {
  var transformed_data = [];

  // Loop through the original data
  for(var d in data) {
    var obj = data[d];

    // If you have the correct campaign data
    if(obj.name === campaign) {

      // For each data entry in this object
      for(var obj_d in obj.data) {
        var obj_data = obj.data[obj_d];

        // Create a temporary transformed object to hold the proper data
        var transformed_obj = {
          date: obj_data.date,
          count_0: obj_data[sort]
        }

        // This console log shows the transformed_obj in the expected format
        console.log(transformed_obj);

        // Push the temporary object into the helper array
        transformed_data.push(transformed_obj);

        // This console log flips a shit
        console.log(transformed_data);
      }
    }
  }
  // Return helper array
  return transformed_data;
}
  

Первый консольный вход в эту функцию показывает правильный формат:

Object {date: "2013-01-01", count_0: 17147}

Второй журнал консоли показывает это:

[Object]

Ладно, пока все хорошо… давайте расширим его…

Расширенный:

 0: Object
1: Object
2: Object
3: Object
4: Object
5: Object
6: Object
7: Object
  

Что? Этого вообще не ожидалось… интересно, что произойдет, если мы развернем один из этих объектов…

Расширенный объект:

 count_0: 17147
count_1: NaN
count_2: NaN
count_3: NaN
count_4: NaN
count_5: NaN
date: Mon Dec 31 2012 19:00:00 GMT-0500 (EST)
  

Что???? Почему оно пытается записать свойства count_1 через count_5 ? В чем здесь может быть проблема?


Решаемая

Моя директива пыталась записать свойства в массив, который не существовал, и, по-видимому, директива запускалась перед контроллером. Помечено как закрытое.

Комментарии:

1. Не могли бы вы показать какой-нибудь пример данных и вызова функции, чтобы мы могли попробовать и увидеть результат сами? Это немного сложно отлаживать, если вы не можете попробовать.

2. Я попытаюсь скомпилировать некоторые и добавить их к вопросу.

3. Не используйте for ... in циклы для перебора массивов. Используйте простой for цикл с индексной переменной или .forEach() методом (в более новых браузерах).

Ответ №1:

 var obj_data = obj.data[obj_data]; 
  

разрушает ваш цикл «итератор». Попробуйте использовать другую переменную (например, var element = ).

Кроме того, вы отметили этот вопрос jQuery — почему бы не использовать jQuery?

Комментарии:

1. Хорошая находка, я исправил проблему с переменной. Оно все еще пытается написать несколько count_i вещей, хотя.

2. Хорошо. Продолжайте и обновите свой вопрос. Кроме того, вы когда-нибудь использовали jsFiddle? jsfiddle.net

3. Смотрите комментарий @Pointy выше. Инвестиции в изучение циклов jQuery принесут дивиденды. 🙂

4. Да. Я уже использовал JSFiddle раньше, я пытаюсь создать его прямо сейчас, но там много угловых зависимостей и прочего. Это не работает.

5. Я думаю, вам нужно добавить вторую функцию и показать, как вы их вызываете.