JavaScript对象:这个repl测试正在寻找什么?

时间:2017-12-14 15:22:56

标签: javascript

我正在使用JavaScript开发自定义函数中的一些对象。

我写了一段这样的代码:

function updateObject(obj) {
    var obj = {
        foo: 'foo',
        bar: 'bar',
        bizz: 'bizz',
        bang: 'bang'
    };

    return obj;
}

console.log(updateObject());

我知道这并没有错,因为它在控制台中输出了一个带有键:值对的对象,但它从Repl中失败了这个测试套件:

/* test suite */
(function testUpdateObject() {
  var oldObj = {
    cats: 'cats',
    dogs: 'dogs',
  };
  var newObj = updateObject(oldObj);
  if (typeof newObj !== 'object') {
    console.error('ERROR: `createMyObject` must return an object');
    return false
  }
  ['foo', 'bar', 'bizz', 'bang'].forEach(function(key) {
    if (!(key in newObj)) {
      console.error('ERROR: `' + key + '` not in object returned by `updateObject`');
      return false;
    }
  });
  ['foo', 'bar', 'bizz', 'bang'].forEach(function(key) {
    if (newObj[key] !== key) {
      console.error('ERROR: `' + key + '` should be "' + key + '" but was ' + newObj[key]);
      return false;
    }
  });
  if (!(newObj.cats === 'cats' && newObj.dogs === 'dogs')) {
    console.error('ERROR: your function doesn\'t preserve existing key/value pairs');
    return false;
  }
  console.log('SUCCESS: `updateObject` works correctly!');

})();

具体而言,该功能无法保留现有的键/值对。这就是我想要解决的问题。

我也用点符号和方括号表示法尝试过它:

function updateObject(obj) {
    var obj = {};
    {
      obj.foo ='foo',
        obj.bar ='bar',
        obj.bizz ='bizz',
        obj.bang ='bang'
    }
    return obj;
}

function updateObject(obj) {
    var obj = {};
     {
      obj['foo'] ='foo';
        obj['bar'] ='bar';
        obj['bizz']  ='bizz';
        obj['bang']  ='bang';
    }
    return obj;
}

两种情况console.log(updateObject());

我不知道如何用对象编写这个自定义函数,该对象将通过测试保存键/值对,并且我正在寻找关于如何解决这个问题的一些指导。

我一直无法找到直接说明此案例的Stack Overflow文章,也没有在网上找到任何有关如何编写保留现有键/值对的函数的文档。

4 个答案:

答案 0 :(得分:0)

请勿覆盖您的参数...

function updateObject(obj) {
      obj['foo'] ='foo';
        obj['bar'] ='bar';
        obj['bizz']  ='bizz';
        obj['bang']  ='bang';
    return obj;
}

答案 1 :(得分:0)

您永远不会更新对象,因为您将新对象分配给给定的变量/参数。您需要保留数组并逐步分配值,或使用ES6 Object.assign

function updateObject(obj) {
    obj = obj || {};
    obj.foo = 'foo';
    obj.bar = 'bar';
    obj.bizz = 'bizz';
    obj.bang = 'bang';
    return obj;
}

console.log(updateObject());

(function testUpdateObject() {
    var oldObj = {
        cats: 'cats',
        dogs: 'dogs',
    };
    var newObj = updateObject(oldObj);
    if (typeof newObj !== 'object') {
        console.error('ERROR: `createMyObject` must return an object');
        return false
    }
    ['foo', 'bar', 'bizz', 'bang'].forEach(function (key) {
        if (!(key in newObj)) {
            console.error('ERROR: `' + key + '` not in object returned by `updateObject`');
            return false;
        }
    });
    ['foo', 'bar', 'bizz', 'bang'].forEach(function (key) {
        if (newObj[key] !== key) {
            console.error('ERROR: `' + key + '` should be "' + key + '" but was ' + newObj[key]);
            return false;
        }
    });
    if (!(newObj.cats === 'cats' && newObj.dogs === 'dogs')) {
        console.error('ERROR: your function doesn\'t preserve existing key/value pairs');
        return false;
    }

    console.log('SUCCESS: `updateObject` works correctly!');
})();

答案 2 :(得分:0)

当你说“var obj”时,你正在重新定义obj。删除var。更新了以下代码。

function updateObject(obj) {
    var newObj = {
        foo: 'foo',
        bar: 'bar',
        bizz: 'bizz',
        bang: 'bang'
    };

    // Apply all props of newObj to oldObj, while preserving oldObj
    return Object.assign(obj, newObj);
}

请注意,如果要更新它,更改原始对象就足够了,从技术上讲,您不必返回更新的对象(将参考传递给函数时会保留引用),但无论如何都可能是一个好习惯

答案 3 :(得分:0)

if (!(newObj.cats === 'cats' && newObj.dogs === 'dogs')) {
    console.error('ERROR: your function doesn\'t preserve existing key/value pairs');
    return false;
  }

所以问题是你不保留现有的键/值对。

由于您使用var重新定义obj,而不是向其添加新属性,因此您将覆盖所有旧对。

所以正确的方法是编辑输入的obj而不是重新定义它。您可以手动添加它们:

function updateObject(obj) {
    obj.foo = 'foo';
    obj.bar = 'bar';
    obj.bizz = 'bizz';
    obj.bang = 'bang';
    return obj;
}

如果浏览器支持,可以使用相对较新的Object.assign()方法将两个对象合并到一起:

function updateObject(obj) {
    var extension = {
        foo: 'foo',
        bar: 'bar',
        bizz: 'bizz',
        bang: 'bang'
    };
    return Object.assign( obj, extension );
}