Object.keys返回不等于

时间:2017-07-08 01:15:45

标签: javascript arrays object key

这是我的第一篇文章,我已经研究过,但我不确定我是否在搜索中以正确的方式表达了这个问题。

我试图将对象的键与另一个对象中的键进行比较(这是针对freeCodeCamp算法的)。我的代码如下:

function whereAreYou(collection, source) {
  var arr = [];  
  for (var i=0;i<collection.length;i++) {
    console.log("Object.keys(source)= " + Object.keys(source));
    console.log("Object.keys(collection[" +i + "]))= " + Object.keys(collection[i]));
    console.log("collection[" +i + "].hasOwnProperty(Object.keys(source))= " + collection[i].hasOwnProperty(Object.keys(source)));
    if (collection[i].hasOwnProperty(Object.keys(source))) {
      var prop = Object.keys(source);
      console.log("prop=" + prop);
      console.log("collection[" +i + "][prop]= " + collection[i][prop]);
      console.log("source[prop]= " + source[prop]);
      if (collection[i][prop] === source[prop]) {
        arr.push(collection[i]);
      }
    }
  }
  return arr;
}

当源参数中有多个键时,

if (collection[i].hasOwnProperty(Object.keys(source)))
即使collection [i]确实包含如下所示的键,

也会返回false。

whereAreYou([{ "a": 1, "b": 2 }, { "a": 1 }, { "a": 1, "b": 2, "c": 2 }], { "a": 1, "b": 2 }) 

Object.keys(source)= a,b 
Object.keys(collection[0]))= a,b 
collection[0].hasOwnProperty(Object.keys(source))= false 
Object.keys(source)= a,b 
Object.keys(collection[1]))= a  
collection[1].hasOwnProperty(Object.keys(source))= false  
Object.keys(source)= a,b 
Object.keys(collection[2]))= a,b,c 
collection[2].hasOwnProperty(Object.keys(source))= false
[]

我的问题是为什么a,b和a,b不相等?谢谢你的时间!

2 个答案:

答案 0 :(得分:0)

FreeCodeCamp很棒。如果这是他们所接受的一些培训的具体问题,通常他们的论坛是一个非常好的出路。他们会更多地了解您所询问的内容以及相关内容。但是,如果您只是想比较对象,这似乎相当冗长。

查看堆栈上的其他帖子以查看,这里有一些链接有助于理解比较对象。 Object comparison in JavaScript

来自MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is https://developer.mozilla.org/en-US/docs/Web/JavaScript/Equality_comparisons_and_sameness

答案 1 :(得分:0)

我不确定hasOwnProperty是你想要的。查看hasOwnProperty的定义: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty

您需要比较每个数组中的项目。例如,在第一次迭代:

Object.keys(collection[i]).includes("a") // true
Object.keys(collection[i]).includes("b") // true
Object.keys(collection[i]).includes(Object.keys(source)[0]) // true
Object.keys(collection[i]).includes(Object.keys(source)[1]) // true

您可以迭代Object.keys(source)并将其与Object.keys(collection[i])进行比较,或尝试更短的内容,请参阅: Determining whether one array contains the contents of another array in JavaScript/CoffeeScript

您可以这样做:

function whereAreYou(collection, source) {
    var arr = [];
    for (var i = 0; i < collection.length; i++) {
        for (var j = 0; j < Object.keys(source).length; j++) {
            if (Object.keys(collection[i]).includes(Object.keys(source)[j])) {
                // do your comparisons here
            }
        }
    }
    return arr;
}