|  | 手元の環境で実験してみてました。 
 var ary = [];
 var id = "test";
 localStorage[id] = ary;
 console.log( Object.prototype.toString.call( ary ) );
 console.log( Object.prototype.toString.call( localStorage["test"] ) );
 
 上記を実行したところ、
 [object Array]
 [object String]
 と出力されました。
 
 
 localStorage["test"] = ["123", 456, true];
 console.log( localStorage["test"] );
 
 上記を実行したところ、
 123,456,true
 と出力されました。
 
 
 つまり、変数 obj が localStorage である以上、
 localStorage["test"] = ["123", 456, true];
 は
 localStorage["test"] = ["123", 456, true].toString();
 すなわち
 localStorage["test"] = "123,456,true";
 相当になるという事のようです。
 
 これはつまり、
 obj[this.id] = [];
 が、
 obj[this.id] = "";
 として扱われてしまうことを意味します。
 文字列なので、当然 push できません。
 
 
 配列であることにこだわらず、
 obj[this.id] += (',' + $(this).val());
 のような文字列前提の設計に切り替えては如何でしょう。
 
 どうしても push したいなら、ちょっと手間ですが、
 obj[this.id] = JSON.stringify([]);
 にしておいて、
 var ary = JSON.parse(obj[this.id]);
 ary.push($(this).val());
 obj[this.id] = JSON.stringify(ary);
 として呼び出すとか。
 
 |