2017-04-25 12 views
1

ではない配列が入れ子になった配列に共通のである配列を見つける関数を作成しようとしています。配列はあらかじめソートされています。配列のフィルタの交差(JavaScript)

var array1 = [ [1, 2, 3], [2, 3, 4] [5, 6, 7] ]; 
var array2 = [ [1, 2, 3], [2, 3, 4] [7, 8, 9] ]; 

上記の2つの配列の場合、関数は[5,6,7]と[7,8,9]を返します。

 function arrayIntersection(array1, array2) { 
      return array2.filter(function(values1) { 
       return array2.indexOf(values1) === -1; 
      }); 
     }; 
をしかし、それは動作していないようです:

は、これまでのところ私は持っています。私はindexOf()が正しく比較していないと推測しています。私はES6またはpolyfillsの使用を避けようとしています。

+1

に動作しますか? – mhodges

+1

また、注文は重要ですか? '[5,6,7]'は '[7,6,5]'と同じですか? – mhodges

+0

@mhodgesと合意し、注文は重要ですか?または、値は常にソートされますか? –

答えて

0

あなたは、このタスクを達成するために.every()に建てられ、.filter()配列のメソッドを使用することができます。

var array1 = [ [1, 2, 3], [2, 3, 4], [5, 6, 7] ]; 
 
var array2 = [ [1, 2, 3], [2, 3, 4], [7, 8, 9] ]; 
 

 
function compareArrays(arr1, arr2) { 
 
    if (arr1.length !== arr2.length) { 
 
    return false; 
 
    } else { 
 
    return arr1.every(function(elem) { 
 
     return arr2.indexOf(elem) > -1; 
 
    }); 
 
    } 
 
} 
 

 
function filterUnique(arr1, arr2) { 
 
    return arr1.filter(function(elem) { 
 
    return arr2.every(function(_elem) { 
 
     return !compareArrays(_elem, elem); 
 
    }); 
 
    }); 
 
} 
 

 
function filterIntersection(arr1, arr2) { 
 
    var uniqueToArr1 = filterUnique(arr1, arr2); 
 
    var uniqueToArr2 = filterUnique(arr2, arr1); 
 
    return [].concat(uniqueToArr1, uniqueToArr2); 
 
} 
 

 
console.log(filterIntersection(array1, array2));

+1

完璧に作業しました。ありがとうございました! – poolts

0

まず、フィルタで間違った配列を参照しました。比較を修正するには、配列をjsonにすることができます。また、二番目の配列に対してフィルタを実行して、答えに参加する必要があります。:

var array1 = [ [1, 2, 3], [2, 3, 4], [5, 6, 7] ]; 
 
var array2 = [ [1, 2, 3], [2, 3, 4], [7, 8, 9] ]; 
 

 
function arrayIntersection(input1, input2) { 
 
    var input2NotInInput1 = input2.filter(function(values1) { 
 
     return input1.map(function(val) { return JSON.stringify(val); }).indexOf(JSON.stringify(values1)) === -1; 
 
    }); 
 
    var input1NotInInput2 = input1.filter(function(values1) { 
 
     return input2.map(function(val) { return JSON.stringify(val); }).indexOf(JSON.stringify(values1)) === -1; 
 
    }); 
 
    return input1NotInInput2 .concat(input2NotInInput1); 
 
}; 
 

 
console.log(arrayIntersection(array1, array2));

0

それは最良の選択肢ではないのですが、それはなぜそれがまた `` [5,6,7]を返しません

var ar1 = [ 
 
    [1, 2, 3], 
 
    [2, 3, 4], 
 
    [5, 6, 7] 
 
]; 
 
var ar2 = [ 
 
    [1, 2, 3], 
 
    [2, 3, 4], 
 
    [7, 8, 9] 
 
]; 
 

 
function arrayIntersection(array1, array2) { 
 
    return array2.filter(function(values1) { 
 
    return !array1.some(v => JSON.stringify(v) === JSON.stringify(values1)); 
 
    }); 
 
}; 
 

 
var result = arrayIntersection(ar1, ar2); 
 
console.log(result);