我創建一個函數,檢查兩個數組是否相同,我目前堅持檢查兩個對象(可能在一個數組內)是相同的。問題裏面for..in循環
解釋我的代碼一點點,我有一個名爲可變eq
當函數結束,它應包含true
對存在的第二陣列或在第一陣列中的每個元素所返回undefined
如果一個元素沒有。
此外,我使用遞歸IIFE來檢查對象是否有子對象,並且子對象也是相同的。要檢查數組元素是否是對象字面量我使用el.constructor === Object
。
沒有百分之一百確定,我相信我在for..in
循環中做了一些錯誤。
代碼:
function equals(a, b) {
return (a === b && a !== null) || (a.length === b.length && (function(a, b) {
var eq = [];
a.forEach(function(el1, index) {
b.forEach(function(el2) {
if (el1 === el2) eq[index] = true;
else if (el1.constructor === el2.constructor && el1.constructor === Object) {
/* a -> the object of the first array
* b -> the object of the second array
* c -> eq[index] then eq[index][i] provided how deep it goes */
(function rec(a, b, c) {
c = [];
var i = 0;
for (var prop in a) {
for (var attr in b) {
if (prop === attr && a[prop] === b[attr]) c[i] = true;
else if (prop === attr && a[prop].constructor === b[attr].constructor
&& a[prop].constructor === Object) {
rec(a[prop], b[attr], eq[index][i]);
}
}
i++;
}
})(el1, el2, eq[index]);
}
});
});
return /*!~eq.indexOf(undefined);*/ eq;
})(a, b));
}
/* Use */
var a = [1, {a: "a", b: "b" }, 4, 6],
b = [{a: "a", b: "b"}, 1, 7, 6];
equals(a, b);
實施例1:(工作正常的簡單陣列)
var
a = [1, 3, 4, 6],
b = [3, 1, 7, 6];
equals(a, b); // returns: [true, true, undefined, true]
實施例2:(不爲對象的工作)
var
a = [1, {a: "a", b: "b"}, 4, 6],
b = [{a: "a", b: "b"}, 1, 7, 6];
equals(a, b); /* returns: [true, undefined, undefined, true]
SHOULD return: [true, [true, true], undefined, true] */
任何幫助,將不勝感激。
我敢肯定是比較兩個數組已經存在於許多庫和框架的一個功能。爲什麼重新發明輪子? –
這是我的大學@HubertGrzeskowiak的練習:) –
啊好的。你確定你想比較數組忽略元素的順序嗎? –