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



我正在用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 文章,也没有在网上找到任何关于如何编写保留现有键/值对的函数的文档。

您永远不会更新对象,因为您将新对象分配给给定的变量/参数。您需要保留数组并逐步分配值,或者使用 ES6Object.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!');
})();

只是不要覆盖您的参数...

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

当你说"var obj"时,你正在重新定义 obj。 删除变量。 更新了下面的代码。

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

请注意,如果要更新原始对象,更改原始对象就足够了,从技术上讲,您不必返回更新的对象(当您将其传递到函数中时会保留引用),但无论如何这可能是很好的做法。

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

最新更新