1. JavaScript / Говнокод #16906

    +159

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    var component_prop = {};
    // create property array
    for (var i = 0; i < object_data.properties.length; i++) {
        component_prop[object_data.properties[i].name] = object_data.properties[i].value;
    }
    // convert property arrays to JSON object for parameters on component create
    component_prop = JSON.parse(JSON.stringify(component_prop));

    может кто-то понимает этот танец?

    Запостил: kissarat, 22 Октября 2014

    Комментарии (5) RSS

    • Если размышлять логически, этот танец (а) выпилит все значения-функции и значения-undefined, (б) не будет работать в IE9 и других старых браузерах, (в) не допустит использования тех значений, которые нельзя экспортировать.
      Может, автор хотел облегчить себе валидацию данных (т.к. переданное в другом модуле значение { toString : function(){ alert(1); } } не порадует), а может он просто уже трое суток не спал.

      P.S. Погуглил хак: deep clone. А может, там были значения-объекты, которые надо было скопировать и изменить?
      Ответить
      • т.е. достаточно проверить есть ли свойство функцией или undefined?
        Ответить
        • Ещё надо проверить, объекты/массивы ли они. И если да, то изменяются ли. Скорее всего, автор применил этот хак из-за копирования.

          var object_data = {
            properties: [
              {name: 'test', value: {x: 42} }
            ]
          };
          
          // код из топика, но без JSON.*
          var component_prop = {};
          // create property array
          for (var i = 0; i < object_data.properties.length; i++) {
              component_prop[object_data.properties[i].name] = object_data.properties[i].value;
          }
          
          console.log(object_data.properties[0].value.x); // 42, как и было
          component_prop.test.x = 4;
          console.log(object_data.properties[0].value.x); // 4, хреново
          Ответить
    • Стандартный подход. Так и в жабе и в AS без лишних затей клонируют объекты.
      Например: govnokod.ru/10222
      Рекурсивное глубокое клонирование таит много граблей.

      Edit: Also deep equals - govnokod.ru/12842
      Ответить
      • В принципе, наверное, не столько копирование, сколько избавление от ссылок на объекты. Хотя в данном случае, не принципиально, поскольку, судя по всему поля name и value наврядли являются сколь-нибудь объектами.
        Ответить

    Добавить комментарий