2

「最後」で最大のインデックスを持つ要素を考慮する場合、JavaScript オブジェクトの最後の要素を見つけるにはどうすればよいですか? つまり、ajax 経由で (json として) 配列に似たオブジェクトを受け取っていますが、数値以外のキーもあります。

var received = {
   0: 'something',
   1: 'something else',
   2: 'some stuff',
   3: 'some more stuff',
   'crap' : 'this screws the whole thing'
}

単純な配列の場合は、を使用しますarray.length。同様に、単純に要素ごとに繰り返し処理して見つけることができます。

より良い方法はありますか?ソリューションに jQuery が必要な場合は、それも問題ありません。

4

6 に答える 6

3

これは zzzzBov と David Müller のコードのように機能しますが、ライブラリ関数を使用するとコードが大幅に短くなります。

Math.max.apply(null, Object.keys(test).filter(isFinite)) // 3

列挙可能に拡張されたプロトタイプ オブジェクトを持つオブジェクトがある場合 (JSON.parse結果の場合はそうではありません) 、Object.getOwnPropertyNames代わりに使用することをお勧めします。

于 2012-11-11T22:35:23.803 に答える
1
var received = {
   0: 'something',
   2: 'some stuff',
   3: 'some more stuff',
   1: 'something else',
   'crap' : 'this screws the whole thing'
};

var prop,
    max = -1;
for ( prop in received ) {
  if ( Object.prototype.hasOwnProperty.call(received, prop) && !isNaN(prop) ) {
    max = Math.max(max, prop);
  }
}

console.log(max);
于 2012-11-11T23:02:30.323 に答える
1

配列 ([]ではなくで作成される{}) では、lengthプロパティは最後に割り当てられたインデックスよりも 1 つ大きくなります。そう:

var a = [];
a[0] = 'something';
a[5] = 'else';
a["foo"] = 'bar';
console.log(a.length);

fooは、配列の要素が 2 つしかなく、プロパティが に設定されていても、"6"を出力し'bar'ます。length プロパティは、数値インデックスによってのみ影響を受けます。

于 2012-11-11T22:25:00.310 に答える
1

これは配列ではなく、オブジェクト リテラルです。さらに、オブジェクト リテラル内の項目の順序は、作成後に保持されるとは限りません (ただし、ほとんどのブラウザーはそれに従っているようです)。

そうは言っても、一般的にあなたの質問に対する答えは、「できない」です。できることは、すべてのプロパティを繰り返し処理し、最後のプロパティまたは関心のあるものを見つけることです (オブジェクトをメンバとしてプレーンな JavaScript オブジェクトをループする方法は? を参照してください)。ただし、反復中にプロパティが宣言されている順序を保持する必要はないことに注意してください。

ただし、これが真の配列 ('crap'キーを無視する) である場合、それは非常に簡単です。

received = [
 'something',
 'something else',
 'some stuff',
 'some more stuff'
];

var last = received[received.length - 1];
于 2012-11-11T22:21:36.007 に答える
0

もちろん、これは最もエレガントなアプローチではありませんが、リテラルに固執する必要がある場合、他に選択肢はありません

<script>
var received = {
   0: 'something',
   1: 'something else',
   2: 'some stuff',
   3: 'some more stuff',
   'crap' : 'this screws the whole thing'
};

var max = null;

for (var i in received)
{
    if (received.hasOwnProperty(i) && !isNaN(i))
    {
        if (max == null || i > max)
            max = i;
    }
}

if (max)
    alert(received[max]); //some more stuff
</script>
于 2012-11-11T22:26:38.430 に答える
0

最大の数値インデックス値を持つアイテムを知りたい場合は、オブジェクト内のすべてのキーを反復処理する必要があります。

(function () {
    var i,
        o,
        temp;
    o = getYourObject();
    temp = -Infinity; //lowest possible value
    for (i in o) {
        if (o.hasOwnProperty(i) &&
            !isNaN(i) &&
            +i > temp) {
            temp = +i;
        }
    }
    console.log(temp); //this is the key with the greatest numeric value
}());
于 2012-11-11T22:27:12.173 に答える