我正在创建一个函数来检查两个数组是否相同,而我目前一直在检查两个对象(可能位于数组内)是否相同。
为了稍微解释一下我的代码,我有一个名为 eq
的变量,该变量在函数结束时返回,并且应包含 true
对于第二个数组中存在的第一个数组的每个元素,如果元素不存在,则为 未定义
。
此外,我使用递归 IIFE 来检查对象是否具有子对象,并且子对象是否也相同。要检查数组元素是否是对象文字,我使用 el.constructor === Object
。
虽然不是 100% 确定,但我相信我在 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] */
任何帮助将不胜感激。
最佳答案
我认为问题在于您的 eq[index]
被传递给比较器函数。这不会传递引用,而只是传递一个未定义的值。通过在函数内设置c = []
,您将覆盖新数组未定义的内容。与 eq
没有任何联系。重构您的代码,以便您可以在 rec
外部的 eq[index]
中创建数组并将其传入 (c
)。或者让函数 rec
返回一个值。
关于javascript - for..in 循环内的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39638985/