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