【问题标题】:Object.keys returning as not equalObject.keys 返回不相等
【发布时间】:2017-12-12 09:22:27
【问题描述】:

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

我正在尝试将一个对象的键与另一个对象中的键进行比较(这是针对 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 不相等?感谢您的宝贵时间!

【问题讨论】:

  • 非常感谢您抽出宝贵时间提供帮助!在发布之前,我确实想出了一个更好的方法来解决算法,我想我应该在这方面更清楚。我试图理解为什么 collection[0].hasOwnProperty(Object.keys(source)) 在上面的集合 [0] 和 Object.keys(source) 都等于 a,b 时等于 false。
  • 鉴于 whereAreYou([{ "a": 1 }, { "a": 1 }, { "a": 1, "b": 2 }], { "a": 1 }) Object.keys(source)= a Object.keys(collection[0]))= a collection[0].hasOwnProperty(Object.keys(source))= true Object.keys(source)= a Object.keys(collection[1]))= a collection[1].hasOwnProperty(Object.keys(source))= true Object.keys(source)= a Object.keys(collection[2]))= a,b collection[2].hasOwnProperty(Object.keys(source))= true [] 为什么 a,b 不返回 true?

标签: javascript arrays object key


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我不确定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;
    }
    

    【讨论】:

      猜你喜欢
      • 2017-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-27
      • 2018-08-07
      相关资源
      最近更新 更多