2017-12-14 4 views
4

私がプッシュされている例えば、その中に他の配列を持つ配列があります:あなたは、同じセットを持つ2つの配列があることがわかります。このアレイでは配列を一度アレイにプッシュできるようにするには?

const Arrays = [ [1,2,3], [4,5,6], [7,8,9], [2,1,3] ]; 
let myArr = []; 

Arrays.map(arr => { 
    if(myArr.indexOf(arr)){ 
    return 
    } 
    myArr.push(arr) 
}) 

const myArr = [ [1,2,3], [4,5,6], [7,8,9], [2,1,3] ];

を。数字1,2および3。私はどういうわけか、次のような条件を設定したいと考えています:

この配列がすでに存在する場合は、この配列が何らかの順序で再び追加されないようにしてください。ループの中でこの数字の集合が再び出てくると、それをスキップします。

+3

あなたもあなたの試み(コード)で編集できるように、我々はあなたがそれを変更することができますか? –

+0

デフォルトでは、同じ要素**を同じ順序で持つ** 2つの配列は等しいです**。順序を無視する戦略を策定する必要があります。 –

+0

good sir –

答えて

5

の前に同じ配列がすでに存在するかどうかを確認するには、some()every()メソッドを使用できます。

const myArr = [ [1,2,3], [4,5,6], [7,8,9] ]; 
 
let input = [2,1,3] 
 

 
function check(oldArr, newArr) { 
 
    return oldArr.some(a => { 
 
    return a.length == newArr.length && 
 
     a.every(e => newArr.includes(e)) 
 
    }) 
 
} 
 

 
if(!check(myArr, input)) myArr.push(input) 
 
console.log(myArr)

+0

ありがとうございました!それはちょうどうまくいきました、もし私が尋ねることができるならば、これは配列を通過し、最初に新しい配列が配列の長さのどれかにマッチするかどうかを確認し、もしそうなら配列を返します本当ですか?これは正しいです? –

+1

これは、あなたのケースでoldArrまたは 'myArr'をループし始め、' some'メソッドのために最初のマッチ時にループを終了し、true/falseを返します。次に、 'some'ループの現在の要素が' newArr'と同じ長さであるかどうかをチェックし、そうでなければfalseを返します。もしそうなら、 'myArr'からの現在の配列のすべての要素が'newArr'にも含まれています。 –

+0

インターネットエクスプローラはサポートしていないので、.includesメソッドを使用する場合は注意が必要です。 –

2

あなたはsorted element with joinedで一時配列を作成し、一つの方法は、.sort(と数値的にそれらを並べ替えることであるindexOf

const myArr = [ [1,2,3], [4,5,6], [7,8,9], [2,1,3],[6,5,4] ]; 
 
var newArr = []; 
 
var temp = []; 
 
for(let i in myArr){ 
 
    let t = myArr[i].sort().join(","); 
 
    if(temp.indexOf(t) == -1){ 
 
    temp.push(t); 
 
    newArr.push(myArr[i]); 
 
    } 
 
} 
 
console.log(newArr);

-1

により確認することができます)その後、それらを比較する。

1

受け入れ答えは2つだけの値が配列であり、配列は

[1, 1, 2] 

[1, 2, 2] 

のような異なる数の二つの値に対してチェックしなければならない特殊なケースを尊重していません異なる配列である。

解決策としては、Mapを使用して、最初の配列の同じ値の発生をカウントし、他のarrrayの値のカウントを減算することをお勧めします。

結果として、Mapのすべての要素がゼロであるかどうかのチェックを返します。

function compare(a, b) { 
 
    var map = new Map; 
 
    a.forEach(v => map.set(v, (map.get(v) || 0) + 1)); 
 
    b.forEach(v => map.set(v, (map.get(v) || 0) - 1)); 
 
    return [...map.values()].every(v => !v); 
 
} 
 

 
var array = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [2, 1, 3], [1, 1, 2], [1, 2, 2], [2, 1, 1], [2, 1, 2]], 
 
    unique = array.reduce((r, a) => (r.some(b => compare(a, b)) || r.push(a), r), []); 
 

 
console.log(unique);
.as-console-wrapper { max-height: 100% !important; top: 0; }

関連する問題