1

実はシンプルなアレイリゾートを作りたいです。

var preSelected = "13_335 14_555";
var arrayClasses = preSelected.split(' ');
var arrayClassesSorted = new Array();

$.each(arrayClasses, function() {
//var elCount = $("li."+ this).size();
elCount = 20 ...... ;
arrayClassesSorted[elCount] = this;
    ....
});

結果は次のような配列になるはずです(カウンターはliクラスなしでは機能しません...):

Array (
  [20] => 14_555
)

しかし、私が得る結果はこれです:

[20] => Array
    (
        [0] => 1
        [1] => 4
        [2] => _
        [3] => 5
        [4] => 5
        [5] => 5
)

そして今、私は知りたいのですが、なぜ「これ」がこの配列の2番目の次元を作成するのか。

これをString(this)に入れると、その動作がわかります。しかし、これは本当にこの場合の「これ」の望ましい結果ですか?

4

1 に答える 1

3

これはコンソールに表示される内容であり、実際には2次元配列があることを意味するものではないと思います。あなたが見るすべてを真実と見なさないでください。

文字列プリミティブの代わりに文字列オブジェクトを割り当てている場合、コンソールはオブジェクトを配列のようなオブジェクトとして扱います。これは、オブジェクトに数値プロパティがあるためです。.length

Chromeコンソールが文字列オブジェクトと文字列プリミティブに対して出力するものは次のとおりです。

> console.log(new String('foo'));
  String {0: "f", 1: "o", 2: "o"}
  undefined
> console.log('foo');
  foo
  undefined

文字列オブジェクトは予期しない動作を引き起こす可能性があるため、常に避ける必要があります。

> new String('foo') === 'foo'
  false

プリミティブ値をより適切に割り当てます。

$.each(arrayClasses, function(val) {
    //var elCount = $("li."+ this).size();
    elCount = 20 ...... ;
    arrayClassesSorted[elCount] = val;
    ....
});

「文字列オブジェクトはどこから来たのですか?」あなたは尋ねるかもしれません。

thisアレイに割り当てています:

arrayClassesSorted[elCount] = this;

関数がstrictモード[MDN]で実行されない限り、常にオブジェクトにthisなります(プリミティブ値はオブジェクトに変換されます)。

于 2013-02-27T13:47:36.783 に答える