我正在尝试在唯一的钥匙值对上添加一个集合,但是当我检查该对象是否在对象内时,它说不是。查看对象是否已经包含另一个对象的最佳方法是什么?
const obj = {
1: {row: 1, col: 1},
2: {row: 2, col:2 }
}
const test = { row:1, col: 1 }
Object.values(obj).indexOf(test) // returns -1
它失败了,因为,尽管两个对象包含相同的数据,但它们在内存中的两个对象"实例"并不完全相同(即两个名为" Scott"的人并不完全相同一个"斯科特"(。
如果您针对内存中的实际对象进行了测试,则会获得更好的结果:
const obj = {
1: {row: 1, col: 1},
2: {row: 2, col:2 }
}
const test = obj["1"];
console.log(Object.values(obj).indexOf(test));
因此,这里要做的是将每个对象转换为字符串,然后查找字符串:
const obj = {
1: {row: 1, col: 1},
2: {row: 2, col:2 }
}
let sObj = JSON.stringify(obj); // Convert object to be tested against into a JSON string
function testKeys(key){
Object.keys(obj).forEach(function(o){
if(JSON.stringify(obj[o]).indexOf(key) > -1){
console.log("Match found at key: " + o);
} else {
console.log("No match found at key " + o);
}
});
console.log("-".repeat(25));
}
testKeys(JSON.stringify({row: 1, col: 1}));
testKeys(JSON.stringify({row: 2, col:2 }));
testKeys(JSON.stringify({row: 2, col: 3}));
具有相同值的对象绝不是 ===
,除非它们均来自相同的对象参考。当您测试对象是否为 ===
到另一个对象时,它基本上检查两个变量是否指向内存中的同一位置。
在这里,您创建了一个对象1: {row: 1, col: 1}
,然后在test
中创建另一个对象。它们与众不同,因此测试如果obj
包括test
将失败。
代替findIndex
功能的测试:
const obj = {
1: {row: 1, col: 1},
2: {row: 2, col:2 }
}
console.log(Object.values(obj).findIndex(testObj => testObj.row === 1 && testObj.col === 1))
这是一个更通用的解决方案。您可以将对象与json.stringify进行比较。然后,您不必比较对象的每个值。
const obj = {
1: {row: 1, col: 1},
2: {row: 2, col:2 }
}
const test = { row:1, col: 1 }
var count = Object.keys(obj).map(key => obj[key]).filter(value => JSON.stringify(value) === JSON.stringify(test)).length;
console.log(count);