2

私は次のコードを持っています:

arr = ["abc", "def", "ghi", "jkl"]
arr2 = ["abc", "def", "ghi", "jkl"]

$(arr).each(function(){
    thiselem = this;

    $(arr2).each(function(){
        if(thiselem == "abc" && this == "abc")
            alert("case 1");
        if(thiselem == this)
            alert('case 2');
    });
});

これを実行すると、「ケース1」のみがポップアップします。論理的には、このステートメントは推移的なプロパティによって真になるはずなので、JavaScript文字列の構文上の問題か、jQueryスコープの問題がこれを台無しにしていると思います。アドバイスをいただければ幸いです。

4

4 に答える 4

2

他のポスターが回避策を提案しています。元のコードが機能しない理由についての質問に答えようと思います。答えはかなり自明ではなく、いくつかの知っておくべきjavascriptの落とし穴を明らかにします。

jQuery.eachapplyを使用thisしてコールバックに渡します。applyの引数が文字列などのプリミティブ値である場合、「ボックス化」されます。つまり、オブジェクト(具体的にはStringオブジェクト)に変換されます。

console.log(typeof("cat"))  // string

logger = function() { console.log(typeof(this)) }
logger.apply("cat")  // object

ここで、次のことを考慮してください。

a = ["abc"]
b = ["abc"]

$(a).each(function() {
   var that = this
   $(b).each(function() {
       console.log(this == that) // false!
   })
})

a[0]とb[0]は「明らかに」等しい==ですが、両方がオブジェクトであり、2つのオブジェクト変数が物理的に同じオブジェクトである場合にのみ等しいため、演算子はfalseを返します。反対側では、これは期待どおりに機能します。

a = ["abc"]
b = ["abc"]

$(a).each(function() {
     console.log(this == "abc") // true
     console.log(this == b[0]) // true
})

JSがオブジェクトを文字列と比較する場合、オブジェクトはを使用して文字列プリミティブに変換されますtoStringthisはStringオブジェクトであるためtoString、それが作成されたプリミティブ文字列を返します。2つのプリミティブ文字列は、文字が等しい場合は等しくなります。

于 2012-06-05T16:47:23.870 に答える
1

以下のようにしてみてください、

var arr = ["abc", "def", "ghi", "jkl"]
var arr2 = ["abc", "def", "ghi", "jkl"]

$(arr).each(function(idx, el){
    $(arr2).each(function(idx, iEl){
        if(el == "abc" && iEl == "abc")
            alert("case 1");       
        if(el == iEl)
            alert('case 2');
    });
 });

注:上記は単なる擬似コードだと思います。あなたが何をしようとしているのかを私たちに知らせてくれれば、私たちはより良い手助けをすることができます。

デモ

于 2012-06-05T16:10:03.460 に答える
0
arr = ["abc", "def", "ghi", "jkl"]
arr2 = ["abc", "def", "ghi", "jkl"]

$(arr).each(function(index, val1) {
    $(arr2).each(function(i, val2) {
        if (val1 == "abc" && val2 == "abc") alert("case 1");
        if (val1 == val2) alert('case 2');
    });
});

サンプルワークアウト

于 2012-06-05T16:06:07.767 に答える
0

これを試して:

var arr = ["abc", "def", "ghi", "jkl"]
var arr2 = ["abc", "def", "ghi", "jkl"]

jQuery.each(arr,function(key1, val1){
  jQuery.each(arr2,function(key2, val2 ){
    if(val1 == "abc" && val2 == "abc")
        alert("case 1");       
    if(val1 == val2)
        alert('case 2');
   });
});​

これがデモです

于 2012-06-05T16:24:36.480 に答える