使用嵌套的 for 循环比较 2 个对象的值
Comparing 2 objects' values with nested for loops
var has = {
name: 'dog',
surname: 'cat',
skills : {
football: true,
basketball: true,
volleyball: true
}
}
var pas = {
name: 'dolphin',
surname: 'cat',
skills : {
football: false,
basketball: false,
volleyball: true
}
}
function compare(Obj1, Obj2) {
var values1 = Object.values(Obj1);
var values2 = Object.values(Obj2);
var equivalent = [];
for (var i = 0; i < values1.length; i++) {
for (var j = 0; j < values2.length; j++) {
if (i === j ) {
equivalent.push(values1[i]);
}
}
}
console.log(equivalent, values1, values2);
}
compare(has, pas);
我正在尝试使用嵌套 for 循环按值比较 2 个对象。它可能不是用于这种简单比较的最佳方法,但作为新手,我真的很想知道为什么它不能正常工作。
您的代码中有一些错误。首先,当您实际上想要比较某些值时,您正在比较 i
和 j
。
我会通过获取对象的键并在它们之间迭代来解决问题。如果两个对象都具有这些键并且值相同,我会将它们添加到等效数组中。
var has = {
name: 'dog',
surname: 'cat',
skills: {
football: true,
}
}
var pas = {
name: 'dolphin',
surname: 'cat',
skills: {
football: true,
}
}
function compare(Obj1, Obj2) {
var values1 = Object.values(Obj1);
var values2 = Object.values(Obj2);
var equivalent = [];
var keys = Object.keys(Obj1);
keys.forEach(k => {
if (Obj1.hasOwnProperty(k) && Obj2.hasOwnProperty(k)) {
if (Obj1[k] === Obj2[k]) {
equivalent.push(Obj1[k]);
}
}
});
console.log(equivalent);
}
compare(has, pas);
但是,这不适用于嵌套对象,就像您的情况一样。为什么?因为即使嵌套对象(在你的情况下是技能)具有相同的值,它们是不同的对象,不同的引用,所以比较会失败。查看 js 中的对象比较是如何工作的 here or here。
在这种情况下,一般的递归解决方案可能如下所示:
var has = {
name: 'dog',
surname: 'cat',
skills: {
football: true,
basketball: true,
volleyball: true
}
}
var pas = {
name: 'dolphin',
surname: 'cat',
skills: {
football: true,
basketball: false,
volleyball: false
}
}
function compare(Obj1, Obj2) {
var values1 = Object.values(Obj1);
var values2 = Object.values(Obj2);
var equivalent = [];
var keys = Object.keys(Obj1);
keys.forEach(k => {
if (Obj1.hasOwnProperty(k) && Obj2.hasOwnProperty(k)) {
if (typeof Obj1[k] === 'object') {
let recursiveAnswer = compare(Obj1[k], Obj2[k]);
equivalent.push(...recursiveAnswer);
} else if (Obj1[k] === Obj2[k]) {
equivalent.push(Obj1[k]);
}
}
});
return equivalent;
}
let equiv = compare(has, pas);
console.log(equiv);
在这里,如果我遇到一个也是对象的值,我会再次调用该函数。递归调用完成后,将推送部分答案。您会看到最终答案还将包含此处的 true
值,该值来自 football
字段,因为它们相等(在我的示例中)。在 cat
字符串中的数组中包含 true/false 值可能会造成混淆,因此您实际上可以添加键名而不是 bool 字段的值。
您可以像这样修改 if 和 push:
if (typeof Obj1[k] === 'boolean') {
equivalent.push(`(${k}, ${Obj1[k]})`);
} else {
equivalent.push(Obj1[k]);
}
这将产生以下输出:
[
"cat",
"(football, true)"
]
如果您有任何问题,请告诉我。
干杯!
var has = {
name: 'dog',
surname: 'cat',
skills : {
football: true,
basketball: true,
volleyball: true
}
}
var pas = {
name: 'dolphin',
surname: 'cat',
skills : {
football: false,
basketball: false,
volleyball: true
}
}
function compare(Obj1, Obj2) {
var values1 = Object.values(Obj1);
var values2 = Object.values(Obj2);
var equivalent = [];
for (var i = 0; i < values1.length; i++) {
for (var j = 0; j < values2.length; j++) {
if (i === j ) {
equivalent.push(values1[i]);
}
}
}
console.log(equivalent, values1, values2);
}
compare(has, pas);
我正在尝试使用嵌套 for 循环按值比较 2 个对象。它可能不是用于这种简单比较的最佳方法,但作为新手,我真的很想知道为什么它不能正常工作。
您的代码中有一些错误。首先,当您实际上想要比较某些值时,您正在比较 i
和 j
。
我会通过获取对象的键并在它们之间迭代来解决问题。如果两个对象都具有这些键并且值相同,我会将它们添加到等效数组中。
var has = {
name: 'dog',
surname: 'cat',
skills: {
football: true,
}
}
var pas = {
name: 'dolphin',
surname: 'cat',
skills: {
football: true,
}
}
function compare(Obj1, Obj2) {
var values1 = Object.values(Obj1);
var values2 = Object.values(Obj2);
var equivalent = [];
var keys = Object.keys(Obj1);
keys.forEach(k => {
if (Obj1.hasOwnProperty(k) && Obj2.hasOwnProperty(k)) {
if (Obj1[k] === Obj2[k]) {
equivalent.push(Obj1[k]);
}
}
});
console.log(equivalent);
}
compare(has, pas);
但是,这不适用于嵌套对象,就像您的情况一样。为什么?因为即使嵌套对象(在你的情况下是技能)具有相同的值,它们是不同的对象,不同的引用,所以比较会失败。查看 js 中的对象比较是如何工作的 here or here。
在这种情况下,一般的递归解决方案可能如下所示:
var has = {
name: 'dog',
surname: 'cat',
skills: {
football: true,
basketball: true,
volleyball: true
}
}
var pas = {
name: 'dolphin',
surname: 'cat',
skills: {
football: true,
basketball: false,
volleyball: false
}
}
function compare(Obj1, Obj2) {
var values1 = Object.values(Obj1);
var values2 = Object.values(Obj2);
var equivalent = [];
var keys = Object.keys(Obj1);
keys.forEach(k => {
if (Obj1.hasOwnProperty(k) && Obj2.hasOwnProperty(k)) {
if (typeof Obj1[k] === 'object') {
let recursiveAnswer = compare(Obj1[k], Obj2[k]);
equivalent.push(...recursiveAnswer);
} else if (Obj1[k] === Obj2[k]) {
equivalent.push(Obj1[k]);
}
}
});
return equivalent;
}
let equiv = compare(has, pas);
console.log(equiv);
在这里,如果我遇到一个也是对象的值,我会再次调用该函数。递归调用完成后,将推送部分答案。您会看到最终答案还将包含此处的 true
值,该值来自 football
字段,因为它们相等(在我的示例中)。在 cat
字符串中的数组中包含 true/false 值可能会造成混淆,因此您实际上可以添加键名而不是 bool 字段的值。
您可以像这样修改 if 和 push:
if (typeof Obj1[k] === 'boolean') {
equivalent.push(`(${k}, ${Obj1[k]})`);
} else {
equivalent.push(Obj1[k]);
}
这将产生以下输出:
[
"cat",
"(football, true)"
]
如果您有任何问题,请告诉我。 干杯!