我正在尝试在唯一键值对上添加一个集合但是当我检查该对象是否在对象内部时它说它不是。查看对象是否已包含其他对象的最佳方法是什么?
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
答案 0 :(得分:0)
具有相同值的对象永远不会===
,除非它们都来自同一个对象引用。当你测试对象是否是===
到另一个对象时,它基本上检查两个变量是否指向内存中的相同位置。
在这里,您创建了一个对象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))
答案 1 :(得分:0)
这是一个更通用的解决方案。您可以将对象与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);
答案 2 :(得分:0)
它失败了,因为尽管这两个对象包含相同的数据,但它们并不是内存中完全相同的两个对象“实例”(即两个名为“Scott”的人不是完全相同的“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}));