检查JavaScript中的对象以查看其是否具有另一个对象



我正在尝试在唯一的钥匙值对上添加一个集合,但是当我检查该对象是否在对象内时,它说不是。查看对象是否已经包含另一个对象的最佳方法是什么?

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);

相关内容

  • 没有找到相关文章

最新更新