1

この上から髪を伸ばしています。likes&という 2 つの配列がありdislikes、どちらもそれぞれ約 50 個の文字列で満たされています。

data.resultsまた、約 50 個のオブジェクトを含むJSON オブジェクト もあり、それぞれに_idパラメーターがあります。

との両方にないdata.resultsすべてのオブジェクトを確認しようとしています。likesdislikes

現在の私のコードは次のとおりです。

var newResults = []
      for(var i = 0; i<data.results.length; i++){
        for(var x = 0; x<likes.length; x++){
          if(!(data.results[i]._id == likes[x])){
            for(var y = 0; y<dislikes.length; y++){
                if(!(data.results[i]._id == dislikes[y])){
                  newResults.push(data.results[i]);
                  console.log("pushed " + data.results[i]._id);
                }
                else
                {
                   console.log("They already HATE " + data.results[i]._id + " foo!"); //temp
                }
            }
          }
          else
          {
             console.log(data.results[i]._id + " is already liked!"); //temp
          }
        }
      }

ご覧のとおり、すべてのdata.resultsオブジェクトを繰り返し処理しています。次に、それら_idが にあるかどうかを確認しlikesます。そうでない場合は、 にあるかどうかを確認しdislikesます。それでもそうでない場合は、にプッシュしnewResultsます。

ご覧のとおり、このコードは現在、反復ごとに 1 回ずつ結果を配列にプッシュしているため、最終的に 600 個ほどのオブジェクトの膨大な配列になります。

これを達成するための良い、簡単な方法は何ですか?

4

4 に答える 4

1

配列に要素が含まれているかどうかを確認する場合Array.prototype.indexOf(これは ECMAScript 5 ですが、古いブラウザーではシム可能です) が便利です。~ビットごとの NOT 演算子とブール値へのキャストと組み合わせると、さらに多くのことができます!

これがどのように機能するか見てみましょう。

Array.prototype.indexOfElement が見つからない場合は -1 を返します。

~-1 にa を適用すると が得られ、 a に aを0適用すると が得られます。!0true

したがって!~[...].indexOf (var)、要素が配列に含まれていないかどうかのブール表現が得られます。!!~[...].indexOf (var)Element が見つかった場合は、逆にtrue になります。

このロジックをcontains関数でラップして、単純に再利用しましょう。

function contains (array,element) {
    return !!~array.indexOf (element);
}

ここで必要なのは&&、contains 関数に渡された 2 つの配列の出力を結合するための論理 AND だけです。

var likes = ["a","b","f"] //your likes
var dislikes = ["c","g","h"] //your dislikes

var result = ["a","c","d","e","f"]; //the result containing the strings
var newresult = []; //the new result you want the strings which are NOT in likes or dislikes, being pushed to

for (var i = 0,j;j=result[i++];) //iterate over the results array
     if (!contains(likes,j) && !contains (dislikes,j)) //check if it is NOT in likes AND NOT in dislikes
           newresult.push (j) //if so, push it to the newresult array.

console.log (newresult) // ["d","e"]

ここにフィドルがあります

編集メモ:
1. @Scott が提案したように、contains 関数を追加しました。

于 2013-07-30T11:31:09.170 に答える
0

likes.indexOf(data.results[i]._id) と dislikes.indexOf(data.results[i]._id) を使用します。

if (likes.indexOf(data.results[i]._id) != -1)
{
// they like it :D
}
于 2013-07-30T11:20:29.260 に答える
0

likes最初にとの間の共通文字列の配列を作成してみてくださいdislikes

var commonStrAry=[];
for(var i = 0; i<likes.length; i++){
for(var j=0; j<dislikes.length; j++){
    if(likes[i] === dislikes[j]){
        commonStrAry.push(likes[i] );
    }
}
}

次に、これを使用して data.results をチェックし、一致しない要素を削除するだけです。

于 2013-07-30T11:30:44.993 に答える