Javascript 如何创建将属性值指定给其他属性的函数?

Javascript 如何创建将属性值指定给其他属性的函数?,javascript,function,variables,properties,Javascript,Function,Variables,Properties,我希望有一个函数,可以循环通过变量的特定子属性,并将这些变量分配给具有相同结构的另一个变量 如果原始变量的属性将经常更改值,则将当前值指定给新的变量非常有用 我似乎想不出正确的逻辑来循环特定的属性。这样做的目的是防止在如下情况下逐行分配单个属性 objToLookAt.firstProperty.a = objToLookAtCopy.firstProperty.a; 以下是具有以下结构的JavaScript: var objToLookAt = { firstProperty: {

我希望有一个
函数
,可以循环通过
变量
的特定子
属性
,并将这些
变量
分配给具有相同结构的另一个
变量

如果原始
变量的
属性将经常更改值,则将当前值指定给新的
变量
非常有用

我似乎想不出正确的逻辑来循环特定的
属性。这样做的目的是防止在如下情况下逐行分配单个
属性

objToLookAt.firstProperty.a = objToLookAtCopy.firstProperty.a;
以下是具有以下结构的JavaScript:

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, c: null, d: null
    },
    secondProperty: {
        a: null, b: null, c: null, d: null
    }    
};

function AssignObjValues(objWithValues, objToAssignValuesTo){
    //loop code goes here
    //for each property inside objToLookAt, assign every child of firstProperty and secondProperty
    //to = objToLookAtCopy child properties  

    console.debug(objToAssignValuesTo); //display only the first two properties in console
}

AssignObjValues(objToLookAt, objToLookAtCopy);

如果我理解正确,一个简单的
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]
        }
    }
}

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

在JavaScript中深度复制对象有点棘手。假设您只处理对象文字,没有构造函数创建对象(如数组),您可以执行以下操作(我已取消函数名的大写,因为如果将其大写,则表明函数是构造函数):


这是非常接近我要找的。我在问题中没有详细说明。如何仅将所需的属性分配给新变量?如果说原来的var.@MCSharp中有两个以上的属性,那么你可以用许多不同的方法来实现。您必须以某种方式指定要分配的属性。可能会传入一个属性名称数组,并循环使用它,而不是像我这样的for-in循环。for-in循环非常适合将每个属性分配给新变量。如果我在新对象上执行
控制台.debug
,则会显示上一个对象中的所有属性。特定属性名称的循环是我正在努力解决的问题。不知道如何把它翻译成代码。酷-很高兴你得到了它,@MCSharp。我不太确定你到底做了什么,所以我只想留下答案——我认为这是通用的,足以帮助未来的访问者或者你可以用你使用的代码更新你的答案。谢谢你的答案。不幸的是,这段代码没有复制必要的值。考虑到样本中的两个变量,似乎是这样的。我正在尝试从一个具有很多属性的现有JS库中复制值。此代码复制几乎所有属性,并跳过重要的属性,如
a
b
@MCSharp。它将根据您的请求跳过copy变量中未定义的任何值。对于未复制的属性,console.log说明了什么?那么console.log(propertythastintcomplied.constructor)保留了什么呢?该代码似乎不适用于其他库,如THREE.JS。如果对象具有与three.js对象相同的属性,则会复制所有值。许多被保留为空。如果您可以更新代码以正确使用其他库,我很乐意更改正确答案。@MCSharp不需要,只添加了一个答案,该答案将仅在复制对象定义了相同的成员时复制对象文字值。至于为什么它不适用于你,我不能说,可能复制对象没有定义相同的值,可能原始对象的值来自构造函数,成员来自原型。没有控制台日志,我只能猜测。如果你的代码工作正常,那么你的问题就解决了。你是对的。该函数复制这些值。Firebug正确显示日志,而Chrome添加了额外的原型部件。我在这里创建了一个简单的设置:jsfiddle.net/VsWb9/1753,其中包含一个用于复制其值的多维数据集。它在示例中正常工作。你的回答更适合我问的问题。我已经接受了你的回答。
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}