1

重複のない要素の配列が返される場所の解決策を見つけました:

Array1 = Array1.filter(function(val) {
  return Array2.indexOf(val) == -1;
});

ただし、このコードを少しだけ変更したいと思います。重複のない配列が返されるのではなく、重複がある場合に何かをしたい。問題は、このコードが正確にどのように機能するかわかりません。問題は、どのようvalに設定されるのか、それが何であるかさえわからないということです。

for (var i = 0; i < json.length; i++) { 
    var item = json[i];
    // if json.indexOf(val?), do something
}
4

5 に答える 5

1

次に、Arrayメソッドのドキュメントをfilter読んでください。コールバックのvalパラメーターには、単一の配列アイテムが渡されます。つまりjson[i]itemあなたの場合は次のようになります。

for (var i = 0; i < json.length; i++) { 
    var item = json[i];
    if (json.indexOf(item) >= 0) {
        // do something
    }
}
于 2013-08-28T21:11:03.973 に答える
0

MDNから: indexOf

指定された要素が配列内で見つかる最初のインデックスを返します。存在しない場合は -1 を返します。

MDNから: フィルター

指定された関数によって実装されたテストに合格したすべての要素を含む新しい配列を作成します。

最初の関数trueは、array1 のアイテムが array2 に見つからない場合 (== -1) に戻ることによって機能します。つまり、A を繰り返し、B にないものをすべて追加します。

したがって、重複のみを返すように変更するにtrueは、両方で見つかったものすべてを返します。

Array1 = Array1.filter(function(val) {
    return Array2.indexOf(val) >= 0;
});

Array1 には、重複のあるアイテムのみが含まれるようになりました。

于 2013-08-28T21:17:12.143 に答える
0

val配列内の各要素に対してコールバック関数を呼び出すArray.prototype.filterによって設定されます。フィルタリングしたくないので、代わりにArray.prototype.forEachを使用できます。これは、配列内の各要素に対してコールバック関数を 1 回呼び出します。

Array1.forEach(
  // This function is called once per element in Array1
  function(val){
    if(Array2.indexOf(val) != -1){ // Check if that element is also in Array2
        // `val` is in both arrays,
        // Do something with it
    }
  }
);
于 2013-08-28T21:09:53.633 に答える
0

underscorejs などの最新のライブラリを利用できます。

交差点はあなたが探しているものだと思います: http://underscorejs.org/#intersection

_.intersection([1, 2, 3], [101, 2, 1, 10], [2, 1]);
=> [1, 2]

だからあなたのコードは次のようなものかもしれません

if(_.insersection(arr1, arr2)){
  //since [] array is Falsy in JS this will work as a charm
}
于 2013-08-28T21:15:10.030 に答える