0

だから私はこのようなコードを持っています:

this.convertParametersToGroups = function (nodes) {

        self.selectedParametersGroup([]);
        var emptyParametersList = [];

        var pos = 0;
        var group;
        var tempParametersGroup = [];         
                            // tempParametersGroup: Array[1]
                            // 0: undefined   

        $.each(nodes, function (key, val) {
            emptyParametersList.push(0);
            group = self.convertNodeToParameterGroup(val);
            group.position = pos;
            tempParametersGroup.push(group);
            pos++;
        });

        self.selectedParametersGroup(tempParametersGroup);

        return emptyParametersList;
    };

宣言を並べ替えても、コメントされた結果は変わりません。$.each ループに「グループ」があると、コールバックで最初のステートメントを実行する前に、最初の反復で未定義の値が挿入されました。

ただし、次のように名前を変更すると:

this.convertParametersToGroups = function (nodes) {

        self.selectedParametersGroup([]);
        var emptyParametersList = [];

        var pos = 0;
        var g;
        var tempParametersGr = [];         
                            // tempParametersGr: Array[0]

        $.each(nodes, function (key, val) {
            emptyParametersList.push(0);
            g = self.convertNodeToParameterGroup(val);
            g.position = pos;
            tempParametersGr.push(g);
            pos++;
        });

        self.selectedParametersGroup(tempParametersGr);

        return emptyParametersList;
    };

コメントのように機能します。javascript はどうにかして「グループ」名を配列の「グループ」接尾辞にマップし、それを挿入するか、長さの増分を強制するようです。既知の言語機能が不足していますか、それとも...?

4

1 に答える 1

0

この方法でデバッグを試すことができます。 undefined が実際に配列に追加された時期は非常に明確です。

function makeClone( arr ) {
    return JSON.parse( JSON.stringify( arr ) );
}

this.convertParametersToGroups = function (nodes) {

        self.selectedParametersGroup([]);
        var emptyParametersList = [];

        var pos = 0;
        var group;
        var tempParametersGroup = [];

        console.log( "before loop", makeClone( tempParametersGroup ) );


        $.each(nodes, function (key, val) {
            console.log( "before iteration", key, makeClone( tempParametersGroup ) );
            emptyParametersList.push(0);
            group = self.convertNodeToParameterGroup(val);
            group.position = pos;
            tempParametersGroup.push(group);
            pos++;
            console.log( "after iteration", key, makeClone( tempParametersGroup ) );
        });

        console.log( "after loop", makeClone( tempParametersGroup ) );

        self.selectedParametersGroup(tempParametersGroup);

        return emptyParametersList;
    };
于 2012-05-30T11:00:38.380 に答える