我希望function
可以循环显示properties
的特定子variable
,并将variables
分配给另一个variable
结构
如果原始variable
的{{1}}经常更改值,则将当前值分配给新的variable
非常有用。
我似乎无法想到仅通过特定properties
循环的正确逻辑。目标是在
properties
properties
以下是具有以下结构的JavaScript:
objToLookAt.firstProperty.a = objToLookAtCopy.firstProperty.a;
答案 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}