0

私はこのような配列を持っています:

var arr = [];
arr['A string'] = '123';
arr['Another string'] = '456';

「123」または「456」のインデックスを見つけようとしています。

両方:

var string = $.inArray('123', arr)

var string = arr.indexOf('123')

私に-1を与えています。インデックスが文字列の場合に動作させることは可能ですか?

4

2 に答える 2

3

問題は、JavaScript 配列を連想配列として使用していることですが、そうではありません。JavaScript 配列のインデックスは符号なし 32 ビット整数であるため、*strings** は使用できません。次のように配列を使用します

// I'm guessing that you meant to give numerical and not string values
var arr = [123, 456];

またはオブジェクトを使用する

var obj = { 
    'A string' : 123,
    'Another string' : 456
};

'A string'オブジェクトを使用し、と'Another string'はオブジェクトのプロパティでありobj、配列内の値のようにインデックスを付けることはできないことに注意してください。オブジェクトがプロパティを持っていることを確認するには、いくつかの方法があります。hasOwnProperty

if (obj.hasOwnProperty('A string')) {
    // if obj has property 'A string' as a direct property
}

別のinキーワードは

if ('A string' in obj) {
    // if obj has a property 'A string' as a property (could be an inherited property too)
}

**ティムが指摘するように、文字列が 32 ビットの符号なし整数の文字列表現でない限り、ただし、多くの JavaScript 開発者は、わかりやすくするために整数の使用に固執すると言うと言っても過言ではないと思います。*

于 2010-11-21T19:10:12.147 に答える
3

すべての配列メソッドとlengthプロパティと同様indexOfに、オブジェクトのメソッドはArray配列の数値プロパティのみを考慮します。これらは、名前が符号なし整数であるプロパティです。特定の値を持つプロパティの存在をテストするには、配列を含む任意のオブジェクトに対してこのようなことを行うことができます。プロパティ名の列挙順序については保証されていないため、特定の値を持つプロパティが複数ある場合、どのプロパティを取得するかはわかりません。

function findPropertyWithValue(obj, val) {
    for (var i in obj) {
        if (obj.hasOwnProperty(i) && obj[i] === val) {
            return i;
        }
    }
    return null;
}

var arr = [];
arr['A string'] = '123';
arr['Another string'] = '456';
alert(findPropertyWithValue(arr, "123")); // 'A string'

数値のものを含むすべてのプロパティ名は文字列に変換されるため、文字列を使用して配列プロパティを割り当てることができることに注意してください。

var arr = [];
arr["1"] = "foo";
arr[3] = "bar"
arr.indexOf("foo"); // 1
arr.indexOf("bar"); // 3
于 2010-11-21T19:14:56.950 に答える