1

送信時にフォームを検証するためにループできる単一のjavascriptステートメントで配列(値として他の配列を含む)を定義しようとしていました。

インライン配列を作成する (しようとする) ために私が書いた関数は次のとおりです。

function arr(){
    var inc;
    var tempa = new Array(Math.round(arguments.length/2));
    for(inc=0; inc<arguments.length; inc=inc+2) {
        tempa[arguments[inc]]=arguments[inc+1];
    }
    return tempa;
}

これは、配列を割り当てるためにここで 3 回呼び出されます。

window.validArr = arr(
    'f-county',arr('maxlen',10, 'minlen',1),
    'f-postcode',arr('maxlen',8, 'minlen',6)
);

ただし、javascript デバッガーでは、変数は空であり、arr()関数は何も返しません。このコードが何をすべきかについての私の期待が間違っている理由を誰かが知っていますか?

(私はこの関数なしで配列を作成する方法を考え出しましたが、なぜこのコードが機能しないのか不思議です (私はこれより JavaScript をよく理解していると思いました)。)

4

2 に答える 2

2

あなたのコードが行うことから、実際には配列を作成していません。JavaScript で配列を特別なものにしているのは、数値的にインデックス付けされたプロパティの管理です。それ以外の場合、それらは単なるオブジェクトであるため、他のプロパティも持つことができますが、配列を配列として使用していない場合は、オブジェクトを使用することもできます。

function arr(){
    var inc;
    var tempa = {};
    for(inc=0; inc<arguments.length; inc=inc+2) {
        tempa[arguments[inc]]=arguments[inc+1];
    }
    return tempa;
}

デバッガーから表示されているのは、実際の配列が表示されるべきであるため、配列を表示しようとした結果です。つまり、数値的にインデックス付けされたプロパティです。「arr()」関数をそのまま呼び出してから(例から)結果の「f-county」プロパティを見ると、そこに何かが表示されます。

また、実際の配列が必要な場合は、それらを特定のサイズに初期化してもまったく意味がありませんで新しい配列を作成するだけ[]です:

    var tempa = [];
于 2012-04-11T14:15:19.093 に答える
1

あなたのコードは機能します。変数を調べるだけで、配列にカスタム キーがあることがわかります。展開されていない場合、デバッガーは (数値の) インデックス付きの値のみを短い構文で表示します。何も表示されません。

ただし、配列とオブジェクトの違いを理解する必要がある場合があります。オブジェクトは単なるキーと値のペア (「マップ」と呼ぶことができます) とそのプロトタイプです。配列は特別なタイプのオブジェクトです。これには、特別なプロトタイプ メソッド、length機能、および異なるアプローチがあります: インデックスと値のペアを格納します (インデックスは依然としてキーですが)。したがって、配列を連想配列として使用しないでください

したがって、それらのリテラル構文は次のように異なります。

var array = ["indexed with key 0", "indexed with key 1", ...];
var object = {"custom":"keyed as 'custom'", "another":"string", ...};
// but you still can add keys to array objects:
array.custom = "keyed as 'custom'";
于 2012-04-11T14:38:42.643 に答える