优化一般编辑功能

时间:2015-09-09 13:04:10

标签: javascript object

我正在构建一个通用编辑功能。它将接收两个对象作为参数。第一个对象将包含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很新,我无法弄清楚如何做到这一点。

总之,我想知道如何在不浪费资源的情况下做一些简单的事情,最重要的是,如果我为剑创建另一个属性,则不需要对代码进行更改。

2 个答案:

答案 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?