0

JSON.stringify を使用して以下の配列を文字列に変換しようとすると、空の角括弧のみが表示されます。console.log をデバッグしようとしましたが、文字列に変換したいデータが表示されます。ここで何が間違っているのでしょうか? どんな助けでも大歓迎です!

function jsonSuccess( data ){

        var jsonArr = new Array();

        for( var i = 0; i < data.length; i++ ){
            var shipInfo = new Array();
            var shipRows = new Array();

            $.each( data[i], function( key, value ){


                if ( key == "EniNumber" ) {
                    shipInfo['E'] = value;
                    //console.log( shipInfo.E );
                }

                if ( key == "Name" ) {
                    shipInfo['N'] = value;
                }

                if ( key == "StartDate" ) {
                    shipInfo['S'] = value;
                }

                if ( key == "Rows" ) {

                    $.each( value, function( subKey, subValue ){

                        var rowContent = {
                            "T": subValue.T,
                            "X": subValue.X,
                            "Y": subValue.Y,
                            "D": subValue.D
                        }

                        shipRows.push( rowContent );

                    });

                    shipInfo['R'] = shipRows;
                }

            });


            jsonArr[i] = shipInfo;

            var myJsonString = JSON.stringify(jsonArr);
            console.log(myJsonString);
        }

    }
4

2 に答える 2

6

オブジェクトとして配列を使用しています。

Javascript には、配列とオブジェクトがあります。しかし、ご存知かもしれませんが、配列もオブジェクトであり、これにはいくつかの奇妙な意味があります。

var arr = [];
arr[0] = "foo"; // this is fine
console.log(JSON.stringify(arr)); // [ "foo" ]
arr.length; // 1 ok

しかし、配列はオブジェクトなので、プロパティを割り当てることもできます:

arr.foo = "bar";
console.log(arr); // [ 0: "foo", foo: "bar" ]
console.log(JSON.stringify(arr)); // [ "foo" ] .. where did bar go?
arr.length; // 1 huh?

配列値とオブジェクト プロパティを混在させています。

JSON エンコーダーはオブジェクトを見て、それが (instanceof) であることを確認し、それArrayをシリアル化します。(この例では 1 です) を見るarr.lengthので、ちょうど[ "foo" ]. アレイのプロパティは無視されます。


配列値とオブジェクト プロパティの違いを理解することが重要です。JavaScript の配列は連想しません。配列にプロパティを設定すると、長さが増加せず、for ループでループしても表示されません。


変化する:

var shipInfo = new Array();

に:

var shipInfo = {};
于 2013-10-16T15:39:38.863 に答える