我正在构建一个通用编辑功能。它将接收两个对象作为参数。第一个对象将包含3个可以填充的属性。这意味着某些字段可能未定义。
第二个对象将是原始对象。这将用于填充编辑对象中尚未更改的所有未定义值。始终,原始对象将填充所有属性。编辑过的,只有几个。
功能:
var editSword = function(edited, original) {
var sword = {};
sword.name = edited.name || original.name;
sword.createdById = edited.createdById || original.createdById;
sword.createdByName = edited.createdByName || original.createdByName;
return sword;
}
示例:
editSword (
{ name: 'Rubilacxe' },
{ name: 'Excalibur', createdById: 25, createdByName:'Lorem Ipsum Dolor' }
);
使用此函数调用,返回的对象应为:
{ name: 'Rubilacxe', createdById: 25, createdByName: 'Lorem Ipsum Dolor' }
但是,我该如何避免检查剑的所有区域?让我们假设我正在改变剑的名字,但是剑有40个属性,每个属性都将与'edited.attr'进行核对。我正在考虑使用括号表示法,但我对JS很新,我无法弄清楚如何做到这一点。
总之,我想知道如何在不浪费资源的情况下做一些简单的事情,最重要的是,如果我为剑创建另一个属性,则不需要对代码进行更改。
答案 0 :(得分:2)
您可以使用for (var property in object)
构造。但请记住检查hasOwnProperty
,仅包括该对象的直接属性。
示例:
var editSword = function(edited, original) {
for (var property in original) {
if (original.hasOwnProperty(property)) {
edited[property] = edited[property] || original[property];
}
}
return edited;
}
var edited = editSword (
{ name: 'Rubilacxe' },
{ name: 'Excalibur', id: 25, other:'Lorem Ipsum Dolor' }
);
console.log(edited);
注意:为了避免更改传入的对象,您应该像在问题中一样使用临时对象。
var editSword = function(edited, original) {
var temp = {};
for (var property in original) {
if (original.hasOwnProperty(property)) {
temp[property] = edited[property] || original[property];
}
}
return temp;
}
编辑:(在评论后)
似乎你试图反过来做,用原编的那个覆盖原始对象。在这种情况下,您在评论中提出的代码将起作用:
var editSword = function(edited, original) {
var temp = original; //Avoiding confusion.
for (var property in edited) {
temp[property] = edited[property];
}
return temp;
}
答案 1 :(得分:2)
我相信这是最常用的解决方案:
var editSword = function(edited, original) {
var sword = {};
for (var prop in original) {
if (original.hasOwnProperty(prop)) {
sword[prop] = edited[prop] || original[prop];
}
}
return sword;
}
hasOwnProperty
检查用于忽略原型链中的其他可能属性。
您可能也会对此问题感兴趣:Something like jQuery.extend() but standalone?。