0

私は次の機能を持っています:

function get_stoplight_color(count, position) {
    console.log(count + ', ' + position);

    var colors = {
        'QB' : ['#8b3a25', '#ceca63', '#68c24c', '#68c24c', '#68c24c'],
        'RB' : ['#8b3a25', '#ceca63', '#ceca63', '#ceca63', '#68c24c'],
        'WR' : ['#8b3a25', '#ceca63', '#ceca63', '#ceca63', '#ceca63'],
        'TE' : ['#8b3a25', '#ceca63', '#68c24c', '#68c24c', '#68c24c'],
        'DST' : ['#8b3a25', '#68c24c', '#68c24c', '#68c24c', '#68c24c'],
        'K' : ['#8b3a25', '#68c24c', '#68c24c', '#68c24c', '#68c24c']
    };

    console.log(colors);
    if (count <= 4) return colors.position[count];
    else return '#68c24c';
}

ご覧のとおり、いくつかの vars をコンソールにログ出力しましたが、それらは正常に動作しているように見えます。ただし、実行時に次のエラーが発生します。

キャッチされていない TypeError: 未定義のプロパティ '4' を読み取ることができません

(そのときcount= 4 です。)

繰り返しますが、オブジェクトはcolors明らかに存在しconsole.log(colors)ます。出力は次のとおりです。

Object {QB: Array[5], RB: Array[5], WR: Array[5], TE: Array[5], DST: Array[5]…}

したがって、 = 'QB' および= 4の場合colors.position[count]に戻ると予想されます。#68c24cpositioncount

undefinedこの場合、オブジェクトがまだ返されるのはなぜですか? ありがとうございます。必要に応じて詳細をお知らせします (前もって考えたことはすべて提供しました)。

4

2 に答える 2

4

位置が変数の場合は、 と言う必要がありますcolors[position][count]。そうしないと、JS はpositionをプロパティcolorsと見なし、その値を解決しません。

于 2013-07-29T02:30:50.000 に答える
4

colors.position[count]は のpositionプロパティを使用しますcolors。という意味だと思います。これは、代わりにcolors[position][count]変数position(例: QB) で指定されたプロパティを検索し、結果で (例: ) で指定されたプロパティを検索します。colorscount4

定義されていない可能性positionがある場合は、最後にそのビットを少し変更します。それ以外の:

if (count <= 4) return colors.position[count];
else return '#68c24c';

多分:

return (colors[position] && colors[position][count]) || '#68c24c';

...これは、JavaScript の非常に強力な||and&&演算子を利用しています。


以下のコメントを再確認してください。

うわー、OK、それはうまくいきましたが、どうすればよいかわかりませんか? [] オペランドを配列のインデックスとして表示し、色はオブジェクト (配列ではありません) であるため、それを試しませんでした。

JavaScript では (多くの言語とは異なり)、次の 2 つの方法でオブジェクト プロパティにアクセスできます。

  1. ドット表記とリテラル プロパティ名を使用するobj.foo(プロパティ名が有効な識別子名である場合)、または

  2. 角括弧表記と文字列プロパティ名を使用しますobj["foo"](この場合、プロパティ名はほぼ何でもかまいません。有効な識別子名である必要はありません)。

2 番目のケースでは、文字列は、変数ルックアップを含む任意の式から取得できます。したがって、これらはすべて次を参照しobj.fooます。

obj.foo
obj["foo"]
obj["f" + "o" + "o"]
var x = "o";
obj["f" + x + x]

...そして実際、これは配列を扱うときに使用する表記法と同じです。JavaScript では、配列は実際には配列ではなく、単なるオブジェクトだからです。

于 2013-07-29T02:30:58.267 に答える