2つの配列があるとします:
A [] => 1 2 3 4 5
B [] => 1 2 7 4 5
この場合、2つの配列の一致しない値を与えるjQueryのメソッドはありますか?
Result [] => 3 7
2つの配列があるとします:
A [] => 1 2 3 4 5
B [] => 1 2 7 4 5
この場合、2つの配列の一致しない値を与えるjQueryのメソッドはありますか?
Result [] => 3 7
回答:いいえ。
解決策:標準のJavaScriptループを使用します。
var nomatches = [];
for (var i=Math.min(A.length, B.length); i-->0;) {
if (A[i]!=B[i]) {
nomatches.push(A[i]);
nomatches.push(B[i]);
}
}
// do what you want with remaining items if A.length != B.length
Roryが想定しているように、配列ではなく論理セットを一致させたい場合は、次のようにすることができます。
var nomatches = [];
var setA = {};
var setB = {};
for (var i=A.length; i-->0;) setA[A[i]]=1;
for (var i=B.length; i-->0;) setB[B[i]]=1;
for (var i=A.length; i-->0;) {
if (!setB[A[i]]) nomatches.push(A[i]);
}
for (var i=B.length; i-->0;) {
if (!setA[V[i]]) nomatches.push(B[i]);
}
hiyaワーキングデモはこちら:http: //jsfiddle.net/mbKfT/
よく読んで くださいhttp://api.jquery.com/jQuery.inArray/
これは、要素が配列inArray
に追加されていない場合は、要素が存在することを確認するために使用します。intersect
残りのデモは疑問を訴えます:)
コード
var a1 = [1,2,3,4,5];
var a2 = [1,2,7,4,5];
var intersect = [];
$.each(a1, function(i, a1val) {
if ($.inArray(a1val, a2) === -1) {
intersect.push(a1val);
}
});
$.each(a2, function(i, a1val) {
if ($.inArray(a1val, a1) === -1) {
intersect.push(a1val);
}
});
$("div").text(intersect);
alert(intersect + " -- " + matches);
jQuery.inArray()はいくつかの助けをします:
var a = [1,2,3,4,5], b=[1,2,7,4,5];
var ret =
a.filter(function(el) {
return $.inArray(el, b) === -1;
}).concat(
b.filter(function(el) {
return $.inArray(el, a) === -1;
})
);
console.log(ret);
デモ。_
PS:または、を使用するだけb.indexOf(el) === -1
で、jQueryはもう必要ありません。
var nomatch = [], Bcopy = B.slice(0);
for (var i = 0, j; i < A.length; i++) {
j = Bcopy.indexOf(A[i]);
if (j === -1) nomatch.push(A[i]);
else Bcopy.splice(j, 1);
}
nomatch.push.apply(nomatch, Bcopy);
ノート:
A
このコードは、とのアイテムB
が一意であることを前提としています。indexOf
アレイの場合は、IE8以前のバージョンでエミュレートする必要があります。function getUnique(A, B){
var res = [];
$.grep(A, function(element) {
if($.inArray(element, B) == -1) res.push(element)
});
$.grep(B, function(element) {
if($.inArray(element, A) == -1) res.push(element);
});
return res;
}
使用する:
var A = [1,2,3,4,5],
B = [1,2,3,5,7];
getUnique(A, B);
最新のブラウザ用の別のソリューションは次のとおりです(ワンライナー、はい!):
var a = [1, 2, 3, 4, 5];
var b = [1, 2, 7, 4, 5];
var result = a.concat(b).filter(function(el, i) {
return (i < a.length ? b : a).indexOf(el) == -1;
});
デモ:http: //jsfiddle.net/6Na36/
インデックスチェックも保持したい場合は、次のバリアントを使用できます。
var a = [1, 2, 3, 4, 5];
var b = [1, 2, 7, 4, 5];
var result = a.concat(b).filter(function(el, i, c) {
return el != c[i < a.length ? i + a.length : i - a.length];
});
デモ:http: //jsfiddle.net/6Na36/1/
どちらのバリアントも、異なるサイズのアレイで正常に機能することに注意してください。