2017-02-03 16 views
0

我創建了一個簡單的JavaScript插件,它允許我從特定的html元素收集數據。一個頁面可以有x個元素(通常最多20個),每個元素都有自己的設置。我的問題是返回的對象不是有效的JSON格式,因爲我收到錯誤「多個JSON根元素」。在插件中處理多個JavaScript對象

我認爲原因是因爲我在插件裏面使用了每個函數,它爲每個對象創建一個新的對象,我試圖解決這個問題;結果不好。

所有的幫助將不勝感激,在此先感謝!

樣本插件

(function($) { 

$.fn.collect_data = function() { 


    this.each(function() { 

     var id = "#" + ($(this).attr("id")); 

     // Get numerical value of id 
     var get_package_id = function() { 
      var package_id = id.replace(/[^0-9]/g, ''); 
      return package_id; 
     }  

     // Packages is the top level container 
     var get_packages = function() { 
      var packages = {}; 

      packages = ({[get_package_id()]: {}}); 
      return packages; 
     } 


     // Demo information for each invidual package 
     var get_package_info = function() { 
      var info = {}; 

      $(id).each(function() { 

       info = ({ 
        value: 'Some value', 
        another_value: 'Another value' 
       }); 
      }); 

      return info; 
     } 

     // Demo information for each invidual package 
     var get_more_info = function() { 
      var more_info = {}; 

      $(id).each(function() { 

       more_info = ({ 
        value_more_info: 'Some value', 
        another_value_more_info: 'Another value' 
       }); 
      }); 

      return more_info; 
     }   

     // Combine the demo information 
     var result = function() { 

      var packages = get_packages(); 
      var info = get_package_info(); 
      var more_info = get_more_info(); 

      packages[get_package_id()].info = info; 
      packages[get_package_id()].more_info = more_info; 

      return packages; 
     } 

     $("#show-data").append(JSON.stringify(result(), null, 2)); 

    }); 
    return this; 
} 

}(jQuery));  

無效的結果

   { 
    "33": { 
    "info": { 
     "value": "Some value", 
     "another_value": "Another value" 
    }, 
    "more_info": { 
     "value_more_info": "Some value", 
     "another_value_more_info": "Another value" 
    } 
    } 
}{ 
    "74": { 
    "info": { 
     "value": "Some value", 
     "another_value": "Another value" 
    }, 
    "more_info": { 
     "value_more_info": "Some value", 
     "another_value_more_info": "Another value" 
    } 
    } 
}{ 
    "99": { 
    "info": { 
     "value": "Some value", 
     "another_value": "Another value" 
    }, 
    "more_info": { 
     "value_more_info": "Some value", 
     "another_value_more_info": "Another value" 
    } 
    } 
}{ 
    "124": { 
    "info": { 
     "value": "Some value", 
     "another_value": "Another value" 
    }, 
    "more_info": { 
     "value_more_info": "Some value", 
     "another_value_more_info": "Another value" 
    } 
    } 
}{ 
    "124": { 
    "info": { 
     "value": "Some value", 
     "another_value": "Another value" 
    }, 
    "more_info": { 
     "value_more_info": "Some value", 
     "another_value_more_info": "Another value" 
    } 
    } 
} 

所有的數據也許應該是頂級{}容器,而不是每個對象內部正在裏面自己添加{} 。

感謝您提前提供的所有幫助

回答

0

談論完全過度設計的代碼。所有那些只曾被稱爲一次的功能有什麼意義?爲什麼要製作一個你不能重複使用的插件?

讓我們縮小你的代碼到其實際作用:

var data = $("foo").map(function() { 
    return { 
     package_id: "#" + this.id.replace(/[^0-9]/g, ''), 
     info: { 
      value: 'Some value', 
      another_value: 'Another value' 
     }, 
     more_info: { 
      value_more_info: 'Some value', 
      another_value_more_info: 'Another value' 
     } 
    }; 
}).toArray(); 

$("#show-data").text(JSON.stringify(data, null, 2)); 

旁註:

不要使用數據結構是這樣的:

{ 
    "uniqueID1": {"some": "data"}, 
    "uniqueID2": {"some": "data"}, 
    "uniqueID3": {"some": "data"} 
} 

多數民衆贊成濫用的對象作爲數組。

你真正想在這種情況下創建的是一個數組。這將使所有相關方更容易生活

[ 
    {"id": "uniqueID1", "some": "data"}, 
    {"id": "uniqueID2", "some": "data"}, 
    {"id": "uniqueID3", "some": "data"} 
] 
+0

嘿託默勒格, 插件是用於學習目的,因爲我想學習,瞭解他們是怎麼和如何使用它們。另外,想法是我可以在其他頁面上使用該插件,並使其更具多功能性。但是,您的建議非常好,非常感謝。我會看到它如何適合這種特定的需求。感謝您提供良好的建議:) – Griphon

+0

您也可以在我的示例中重新使用該功能。只需從'.map()'中提取它併爲其命名即可。你的情況不適合插件。插件應該以某種方式操縱DOM,否則它們毫無意義。 – Tomalak

+0

@Griphon你的主要錯誤是試圖通過字符串連接來構建JSON(將文本附加到HTML元素是同樣的事情)。不要這樣做。構建一個數據結構(對象,數組,對象數組,等等)。將它轉換爲JSON是* last *步驟,僅在通過網絡發送或將其保存在某處之前完成。 JSON應該被認爲是不可變的。不要附加到它,不要搜索和替換它,它僅用於存儲或傳輸。您想要進行的任何更改都需要解析JSON,更改數據結構以及將更改後的數據結構重新轉換爲JSON。 – Tomalak