如何创建一个将属性值分配给其他其他属性的函数?

时间:2013-12-19 04:04:04

标签: javascript function variables properties

我希望function可以循环显示properties的特定子variable,并将variables分配给另一个variable结构

如果原始variable的{​​{1}}经常更改值,则将当前值分配给新的variable非常有用。

我似乎无法想到仅通过特定properties循环的正确逻辑。目标是在

之类的情况下逐行防止分配单个properties
properties

以下是具有以下结构的JavaScript:

objToLookAt.firstProperty.a = objToLookAtCopy.firstProperty.a;

2 个答案:

答案 0 :(得分:2)

如果我理解正确,可以使用简单的for in循环。

var objToLookAt = {
    firstProperty: {
        a: 84, b: 66, c: 37, d: 20
    },
    secondProperty: {
        a: 79, b: 26, c: 55, d: 84
    }    
};

然后如果你想复制

var newFirst = {
    a: 1, b: 2, c: 3
}

结束,你可以简单地做

for (var prop in newFirst){
    //prevent possible crap from the prototype from getting copied over
    if (newFirst.hasOwnProperty(prop)) { 
        objToLookAt.firstProperty[prop] = newFirst[prop]
    }
}

因此,对于您的代码,它将是这样的:

function AssignObjValues(objWithValues, objToAssignValuesTo){
    for (var prop in objWithValues){
        //prevent possible crap from the prototype from getting copied over
        if (objWithValues.hasOwnProperty(prop)){ 
            objToAssignValuesTo[prop] = objWithValues[prop]
        }
    }
}

答案 1 :(得分:1)

您的解决方案是将firstProperty和secondProperty硬编码,而不是检查复制对象是否具有赋值的属性,这不是一个非常灵活的解决方案。

在JavaScript中深度复制对象有点棘手。假设您只使用对象文字并且没有构造函数创建对象(如Array),您可以执行以下操作(我没有大写函数名称,因为它会建议函数是构造函数,如果大写它):

var objToLookAt = {
  firstProperty: {
    a: 84, b: 66, c: 37, d: 20
  },
  secondProperty: {
    a: 79, b: 26, c: 55, d: 84
  },
  skipThirdProperty: {
    a: 79, b: 26, c: 55, d: 84
  },
  skipFourthProperty: {
    a: 79, b: 26, c: 55, d: 84
  }
};

var objToLookAtCopy = {
  firstProperty: {
    a: null, b: null, d: null
  },
  secondProperty: {
    a: null, b: null, c: null, d: null
  }
};

function assignObjValues(objWithValues, objToAssignValuesTo) {
  for (var prop in objWithValues) {
    //deep copy object values by recursively calling assignObjValues
    //  but only if objToAssingValuesTo has the same property and is
    //  object as well
    if (objWithValues.hasOwnProperty(prop) &&
            objWithValues[prop] instanceof Object &&
            objToAssignValuesTo.hasOwnProperty &&
            objToAssignValuesTo.hasOwnProperty(prop) &&
            objToAssignValuesTo[prop] instanceof Object) {
      assignObjValues(objWithValues[prop], objToAssignValuesTo[prop]);
      continue;
    }
    //assign primitive values only (string, boolean, number)
    if (objWithValues.hasOwnProperty(prop) &&
            objToAssignValuesTo.hasOwnProperty(prop)) {
      objToAssignValuesTo[prop] = objWithValues[prop];
    }
  }
}

assignObjValues(objToLookAt, objToLookAtCopy);

objToLookAtCopy.secondProperty.b = "Hello World";
console.log(objToLookAt.secondProperty.b)//=26
console.log(objToLookAt.secondProperty === objToLookAtCopy.secondProperty);//false
//notice that c ins't copied because it isn't defined in the copy object
console.log(objToLookAtCopy.firstProperty);//=Object { a=84,  b=66,  d=20}