素朴な疑問だけど解き方がわからない
いくつかの配列がありますが、すべての配列に共通する値のみが必要です
私はjavascriptを使用しています。
このようなものが動作するはずです:
function getCommonElements() {
var common = [],
i, j;
if (arguments.length === 0)
return common;
outerLoop:
for (i = 0; i < arguments[0].length; i++) {
for (j = 1; j < arguments.length; j++)
if (-1 === arguments[j].indexOf(arguments[0][i]))
continue outerLoop;
common.push(arguments[0][i]);
}
return common;
}
任意の数の配列を引数として呼び出します。
var commonEls = getCommonElements(arr1, arr2, arr3, etc);
明らかでない場合は、最初の引数から配列をループし、その各要素を他の配列に対してテストするという考えがあります。特定の要素が他の引数からの他の配列のいずれにもないことが判明するとすぐに、次の要素に進みます。それ以外の場合は、現在の要素を出力配列 に追加しcommon
ます。
Array.indexOf()
メソッドをサポートしていないブラウザー (IE < 9) をサポートする必要がある場合は、MDN ページに示されている shim を含めるか.indexOf()
、コードのテストを別のループに置き換えることができます。
reduce() をサポートする最新のブラウザーのみに関心がある場合は、次の解決策を使用してください。
IE6 をサポートする必要がある場合は、以下のソリューションを使用してください。jQueryを使用してIE6でこれを機能させる方法は次のとおりです。
// Find common values across all arrays in 'a',
// where 'a' is an array of arrays [[arr1], [arr2], ...]
Object.common = function(a) {
var aCommon = [];
for (var i=0,imax=a[0].length,nMatch,sVal; i<imax; i++) {
nMatch = 0;
sVal = a[0][i];
for (var j=1,jmax=a.length; j<jmax; j++) {
nMatch += ($.inArray(sVal, a[j])>-1) ? 1 : 0;
}
if (nMatch===a.length-1) aCommon.push(sVal);
}
return aCommon;
}
基本的に、「a」の最初の配列の各値をループして、それが他の配列に存在するかどうかを確認します。存在する場合は、nMatch をインクリメントし、他の配列をスキャンした後、nMatch が他の配列の総数と等しい場合は、値を aCommon 配列に追加します。
Florian Salihovic によって提供されたサンプル データを使用すると、Object.common(arrs)
が返され[3, 4]
ます。
jQuery を使用できない場合は、$.inArray() を Mozilla が提供するコードに置き換えます。
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/IndexOf
これはうまくいくはずだと思います。
var arr1 = [1,2,3,4]
, arr2 = [2,3,4,5]
, arr3 = [3,4,5,6]
, arrs = [arr1, arr2, arr3];
var all = arr1.concat(arr2.concat(arr3)).sort()
, red1 = all.filter(
function(val, i, arr) {
return i === arr.lastIndexOf(val)-1;
})
, red2 = red1.filter(
function(val, i, arr) {
var shared = true;
arrs.forEach(
function(arr, i, src) {
if (arr.indexOf(val) === -1)
shared = false;
})
return shared;
})