0

こんにちは私はテキストファイルを読み取り、その内容をローカルSQLiteにインポートするために、以下のコードを使用します。

function billtxt()
{
    var billjson = '{"posts" : [', 
        i, 
        line = 0,
        bill = 0,
        Amountint,
        Amountdec;

        jQuery.ajaxSetup({
                'beforeSend' : function(xhr) {
                     xhr.overrideMimeType('text/plain; charset=iso-8859-7');
                },
        });

        jQuery.get('Bill.txt',function(data){
            var mybill = [];
            alert(data.length);
            line=0;
            for (i = 1; i <= ((data.length)/156); i += 1) {
                billjson += '{"Id" :' + '"' + data.substr((line+0), 10).trim() + '"'  + ',';
                billjson += '"Code" :' + '"' + data.substr((line+10), 5).trim() + '"'  +  ',';
                billjson += '"Address" :' + '"' + data.substr((line+14), 40).trim() + '"'  +  ',';
                billjson += '"Name" : ' + '"'  + data.substr((line+54), 50).trim() + '"'  +  ',';
                billjson += '"Description" : ' + '"'  + data.substr((line+104), 8).trim() + '"'  +  ',';
                billjson += '"EntrySeason" : ' + '"'  + data.substr((line+112), 23).trim() + '"'  +  ',';
                billjson += '"Period" : ' + '"'  + data.substr((line+112), 23).trim() + '"'  +  ',';
                Amountint = data.substr((line+146), 7).trim();
                Amountdec = data.substr((line+153), 2).trim();
                billjson += '"Revenue" : ' + '"'  + Amountint + '.' + Amountdec + '"'  +  '}';
                line = i * 156;
                if (line == data.length)
                {
                    billjson += ']';
                }
                else 
                {
                    billjson += ',';
                }
            }

            if (line == 0)
            {
                billjson += ']';
            }


            billjson += "}";

            alert(billjson);
            var mybilljson = jQuery.parseJSON( billjson );
            alert(mybilljson.posts.length);
        for (i = 0; i < (mybilljson.posts.length); i += 1) {

            $.mobile.notesdb.transaction((function(i) {
                return function(t){
console.log(mybilljson.posts[i].Name);
                    t.executeSql('INSERT into bill (barcode, buildingcode, buildingaddress, flatname, flatdescription, entryseason, period, amount) VALUES (?,?,?,?,?,?,?,?);',
                        [mybilljson.posts[i].Id, mybilljson.posts[i].Code, mybilljson.posts[i].Address, mybilljson.posts[i].Name, mybilljson.posts[i].Description, mybilljson.posts[i].EntrySeason, mybilljson.posts[i].Period, mybilljson.posts[i].Revenue]
                            );
                }
            })(i));

    }
});
}

しかし、私は以下のエラーを受け取ります

Uncaught TypeError: Cannot read property 'Id' of undefined 

下の行で

[mybilljson.posts[i].Id, mybilljson.posts[i].Code, mybilljson.posts[i].Address, mybilljson.posts[i].Name, mybilljson.posts[i].Description, mybilljson.posts[i].EntrySeason, mybilljson.posts[i].Period, mybilljson.posts[i].Revenue]

どこが間違っているの?

4

3 に答える 3

1

最初の問題は、JavaScriptで0ベースの場合、配列を1ベースとして使用していることです。
これ

for (i = 1; i <= (mybilljson.posts.length); i += 1) {

する必要があります

for (i = 0; i < (mybilljson.posts.length); i += 1) {

もう1つの問題は、ループ内で無名関数を作成していることです。ループの次の反復の前に無名関数が実行されない場合、の値iが変更されます。IIFEを使用して、iinの値を使用する関数を返すことができます。ループの現在の反復。

            notesdb.transaction((function(i){ 
                return function(t) {
                    t.executeSql('INSERT into bill (barcode, buildingcode, buildingaddress, flatname, flatdescription, entryseason, period, amount) VALUES (?,?,?,?,?,?,?,?);',
                        [mybilljson.posts[i].Id, mybilljson.posts[i].Code, mybilljson.posts[i].Address, mybilljson.posts[i].Name, mybilljson.posts[i].Description, mybilljson.posts[i].EntrySeason, mybilljson.posts[i].Period, mybilljson.posts[i].Revenue]
                            );
                }
            })(i));
于 2012-09-20T20:15:38.247 に答える
0
for (i = 1; i <= (mybilljson.posts.length); i += 1) {

javascriptでは、配列はゼロから始まるインデックスが付けられます。代わりに、次を試してください。

for (i = 0; i < (mybilljson.posts.length); i++) {

率直に言って、あなたのコードは少し混乱しています。このバグを見つけたのは幸運です。他にもあるかもしれません。

于 2012-09-20T19:14:57.193 に答える
0

forループは0から開始する必要があります。

for (i = 0; i < (mybilljson.posts.length); i++) {
  ....
}
于 2012-09-20T19:17:24.620 に答える