[英]Comparing two arrays in Javascript
我在Javascript中有兩個目前看起來像這樣的數組,但是由HTTP請求(節點)更新:
var x = [[292,"2349","902103","9"],[3289,"93829","092","920238"]]
var y = [[292,"2349","902103","9"],[322,"93829","092","920238"],[924,"9320","8932","4329"]]
我想比較這些數組,這樣,如果y內部的數組不在x中,它將被保存到一個新數組 - z
。 請注意,有時數組內部數組的順序會發生變化,但我不希望這會影響結果。
但是,如果x內部的數組不在y中,則不應保存到z
。
我讀了JavaScript數組差異並且能夠復制它,但是如果x
數組沒有顯示在y
,它將被打印到z
。 我想知道是否有可能不存儲,只有y
的不同項目?
使用接受數組的高階函數(隨y
每次迭代而變化)並返回一個新函數,該函數對some
元素(嵌套數組)進行操作。 如果數組包含相同的元素而不管順序,則返回true
。
function matches(outer) {
return function (el) {
if (outer.length !== el.length) return false;
return el.every(function (x) {
return outer.indexOf(x) > -1;
});
}
}
迭代y
並返回不在x
中的數組列表。
function finder(x, y) {
return y.filter(function (el) {
return !x.some(matches(el));
});
}
finder(x, y);
你可以使用這個函數arrayDiff
。
它需要兩個數組(A和B),並返回第一個數組中所有元素的數組,而不是第二個數組(A \\ B),並刪除任何重復項。 如果它們的JSON序列化相同,則兩個數組元素相等。
var x = [[292,"2349","902103","9"],[3289,"93829","092","920238"]];
var y = [[292,"2349","902103","9"],[322,"93829","092","920238"],[924,"9320","8932","4329"]];
var z = arrayDiff(y, x);
// z is [[322,"93829","092","920238"],[924,"9320","8932","4329"]]
// arrayDiff :: [a], [a] -> [a]
function arrayDiff(a1, a2) {
let a1Set = toStringSet(a1),
a2Set = toStringSet(a2);
return Array.from(a1Set)
.filter(jsonStr => !a2Set.has(jsonStr))
.map(JSON.parse);
// toStringSet :: [a] -> Set<String>
function toStringSet(arr) {
return new Set(arr.map(JSON.stringify));
}
}
即使內部數組中的順序不同,這也應該有效。
我假設你只有數字和字符串,你不希望它們之間有嚴格的比較。
var x = [[292,"2349","902103","9"],[3289,"93829","092","920238"]];
var y = [[292,"2349","902103","9"],[322,"93829","092","920238"],[924,"9320","8932","4329"]];
// this will do y \ x
var z = arrDiff(y, x);
console.log(z);
function arrDiff(arr1, arr2) {
var rez = [];
for (var i = 0; i < arr1.length; i++) {
if ( ! contains(arr2, arr1[i])) {
rez.push(arr1[i]);
}
}
return rez;
}
function contains(arr, x) {
x = x.slice().sort().toString();
for (var i = 0; i < arr.length; i++) {
// compare current item with the one we are searching for
if (x === arr[i].slice().sort().toString()) {
return true;
}
}
return false;
}
嘗試這個:
function getArraysDiff(arr1, arr2) {
var x = arr1.map(function(a) { return a.join("") });
var y = arr2.map(function(a) { return a.join("") });
var z = [];
for ( var i = 0, l = arr1.length; i < l; i++ ) {
if ( y.indexOf(x[i]) == -1 ) {
z.push(arr1[i])
}
}
return z;
}
或這個:
x.filter((function(y) {
return function(x) {
return y.indexOf(x.join("")) > -1;
}
}( y.map(function(y) { return y.join("") }) )))
您可以使用Array.prototype.forEach()
, Array.prototype.every()
, Array.prototype.map()
, Array.prototype.indexOf()
, JSON.stringify()
, JSON.parse()
var z = [];
y.forEach(function(val, key) {
var curr = JSON.stringify(val);
var match = x.every(function(v, k) {
return JSON.stringify(v) !== curr
});
if (match && z.indexOf(curr) == -1) z.push(curr)
});
z = z.map(JSON.parse);
var x = [ [292, "2349", "902103", "9"], [3289, "93829", "092", "920238"] ]; var y = [ [292, "2349", "902103", "9"], [322, "93829", "092", "920238"], [924, "9320", "8932", "4329"] ]; var z = []; y.forEach(function(val, key) { var curr = JSON.stringify(val); var match = x.every(function(v, k) { return JSON.stringify(v) !== curr }); if (match && z.indexOf(curr) == -1) z.push(curr) }); z = z.map(JSON.parse); console.log(z); document.querySelector("pre").textContent = JSON.stringify(z, null, 2)
<pre></pre>
你有2個數組:
var x = [[292,"2349","902103","9"],[3289,"93829","092","920238"]];
var y = [[292,"2349","902103","9"],[322,"93829","092","920238"],[924,"9320","8932","4329"]];
要創建Z陣列,您需要以下功能:
function createZ(){
var i,j,k=0,z=[],p=x;
for(j=0;j<y.length;j++){
for(i=0;i<p.length;i++){
if(y[j][0]===p[i][0] && y[j][1]===p[i][1] && y[j][2]===p[i][2] && y[j][3]===p[i][3]){
p.splice(i,1); break;
} else {
z[k++]=y[j]; console.log((y[j][0]===p[i][0])+" "+i+","+j);
}
}
}
return z;
}
請注意,createZ()還會打印出控制台相應條目的i,j。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.