2012-01-05 3 views
0

インデックスは、インデックスが非数値の場合は長さ= 0を定義します。インループのない「非数値インデックスのみ」を持つ配列の長さ

私は長さを取得するこの実装に遭遇しましたが、それでも配列用のループで使用するのは恐れています。 inループの場所のほとんどは「悪い習慣」として指示されています。 see here

このように実装しても問題ありませんか?

誰かが代替ソリューションを提供できますか(forループなし)?

forループを使用する任意の例ですか?

Array.prototypeのプロパティを避けるためにhasOwnProperty(..)メソッドを使用しました。

Array.prototype.global = 1; 

var arr = []; 
arr['first'] = 1; 
arr['second'] = 2; 

console.log(arr.length); //0 

var length = 0; 
for(index in arr){ 
    if(arr.hasOwnProperty(index)) {length++;} 
} 

console.log(length); //3 
+1

はこちらをご覧ください:http://stackoverflow.com/questions/5223/length-of-javascript-associative-arrayループ – jValdron

+0

を。あなたは同じことをするいくつかの関数を見つけることができるかもしれませんが、私はフードの下でループする必要があると確信しています。ループを望んでいない理由は何ですか? –

+0

に私がループのために必要であることをかなり確信しているためだ –

答えて

5

この例では配列を配列として使用していません。

あなたがオブジェクトとして空の配列を使用し始めている何をやったか

['a', 'b', 'c']

.. []シンプルで経由してプロパティにアクセス:JSでの配列は、このようなものの唯一の束(厳密に)されています文字列/変数...そう

var obj = {test: 'blah'} 
obj['test'] //is 'blah' 
obj.test //is also blah 

あなたは、変数を介して、またはプロパティやメソッドは「安全」である何かでない場合、プロパティやメソッドにアクセスしようとしているとき、一般的には[]の表記が使用されています。例えば ​​'int'のように。

だから、あなたが持っているものをオブジェクトに変え、 'for for'ループでキーをステップインします。はい、あなたはまだそれがhasOwnProperty(またはjquery /アンダースコア 'each')を使用するかどうかを確認するためにそれぞれをチェックする必要がありますが、少なくともあなたは仕事のための適切なツールを使用しています:)または、キーの数、underscore.jsにはちょっとした_.keysメソッドがあります。だから、_.keys(obj).lengthはキーの数を与えます。確かにそれはちょうどローカルキー、プロトタイプのものではないことを確認してください..

編集:私はあなたが単純にカウントを得ることができることを認識しているJSのプロパティはありませんキーのそれはあなたがで作業していなかっただけで、特定のものだった場合は「すべてのオブジェクトの、あなたは...

var specialObject = function() {this.keys = 0;}; 
specialObject.prototype.set = function (key, val) { 
    if(!this[key]) { 
     this.keys++; 
    } 
    this[key] = val; 
}; 
var so = new specialObject(); 
so.set('test', 'blah'); 
so.keys //would be 1 
so.test //would be 'blah' 

ような何かを行うことができ、その後、ちょうど常に使用する 『』に設定します。あなたは、 'unset'メソッドと 'get'メソッドを作成したいでしょう。

うまくいけば、これはすべて意味があります。それはちょっとラブリーです。

関連する問題