代码之家  ›  专栏  ›  技术社区  ›  Alex Barbosa

开玩笑说一个功能失败了,另一个功能却没有

  •  1
  • Alex Barbosa  · 技术社区  · 3 年前

    我正在为我的编码训练营写一些日常挑战,我遇到了一个问题。我编写了一个组合对象的函数,它工作正常。以下是问题提示

    提示:编写一个名为mergeObjects的函数,该函数接受至少两个对象作为参数,将第二个到n个对象的属性合并到第一个对象中,然后最终返回第一个对象。如果任何对象具有相同的属性键,则“参数”列表中后面的对象中的值应覆盖前面的值。

    例如:

    mergeObjects({}, {a: 1});  //=> {a: 1} (same object as first arg)
    mergeObjects({a: 1, b: 2, c: 3}, {d: 4});  //=> {a: 1, b: 2, c: 3, d: 4}
    mergeObjects({a: 1, b: 2, c: 3}, {d: 4}, {b: 22, d: 44});  //=> {a: 1, b: 22, c: 3, d: 44
    

    我的职能

     function mergeObjects(...obj) {
      let obj1 = {}
      obj.forEach(element => {
        obj1 = {...obj1, ...element}
      });
      return obj1
    }
    

    解函数

    function mergeObjects1(target, ...objects) {
      objects.forEach(function (obj) {
        // using ES2015's 'for in' loop
        for (var key in obj) {
          target[key] = obj[key]
        }
      })
      return target
    }
    

    在我看来,这两种功能提供了相同的结果。然而,当我通过他们创建的jest测试运行代码时,第一次测试失败。但他们提供的解决方案并没有失败。下面是笑话测试。

    describe('15-mergeObjects', function () {
        it('returns same object', function () {
          var obj = {}
          expect(mergeObjects(obj, { a: 1 })).toBe(obj)
        })
        it('adds additional properties', function () {
          expect(mergeObjects({ a: 1, b: 2, c: 3 }, { d: 4 })).toEqual({
            a: 1,
            b: 2,
            c: 3,
            d: 4
          })
        })
        it('merges props from left to right', function () {
          expect(
            mergeObjects({ a: 1, b: 2, c: 3 }, { d: 4 }, { b: 22, d: 44 })
          ).toEqual({ a: 1, b: 22, c: 3, d: 44 })
        })
      })
    
      describe('15-mergeObjects', function () {
        it('returns same object', function () {
          var obj = {}
          expect(mergeObjects1(obj, { a: 1 })).toBe(obj)
        })
        it('adds additional properties', function () {
          expect(mergeObjects1({ a: 1, b: 2, c: 3 }, { d: 4 })).toEqual({
            a: 1,
            b: 2,
            c: 3,
            d: 4
          })
        })
        it('merges props from left to right', function () {
          expect(
            mergeObjects1({ a: 1, b: 2, c: 3 }, { d: 4 }, { b: 22, d: 44 })
          ).toEqual({ a: 1, b: 22, c: 3, d: 44 })
        })
      })
    

    有人能解释为什么解函数通过而我的函数没有通过吗?

    1 回复  |  直到 3 年前
        1
  •  2
  •   ValleyCrisps    3 年前

    虽然结果看起来相同,但这两个函数略有不同。

    在你的函数中,你正在创建一个 对象,然后向其中添加所有必需的属性。

    在solution函数中,他们将属性添加到原始 target 对象,然后将其返回。

    这两个函数返回的对象将具有相同的键和相同的值,但引用不同,因此它们在JavaScript中不被视为同一个对象。

    在测试中

     expect(mergeObjects1(obj, { a: 1 })).toBe(obj)
    

    .toBe() 检查两个对象是否相同(标识),因此函数的情况下失败。

    注意,有一个不同的测试, .toEqual() ,检查两个对象是否具有相同的键和相同的值(但可能有不同的引用)。你的功能会通过这个测试

     expect(mergeObjects1(obj, { a: 1 })).toEqual(obj)