【问题标题】:angularjs - copy common properties from one object to anotherangularjs - 将公共属性从一个对象复制到另一个对象
【发布时间】:2014-12-08 00:42:11
【问题描述】:

我有一个这样的控制器:

CheckoutController = function() {
    $scope.Profile = {
        firstname : 'Ruchir',
        middlename : 'Shakun',
        lastname : 'Gupta',
        email : 'ruchir@example.com',
        cellphone : '9876543210'
    }

    $scope.BillingDetails = {
        firstname : undefined,
        middlename : undefined,
        lastname : undefined,
        addressline : undefined,
        city : undefined,
        zipcode : undefined
    }

    $scope.update = function() {
        // I want to write some awesome code here as explained below
    }
}

现在,在$scope.update 函数中;我想写一些应该从$scope.Profile复制“只有公共属性”的东西,即firstnamemiddlenamelastname

我试过 angular.copyangular.extend 但是,

  • angular.extend 合并 $scope.BillingDetails$scope.Profile。 所以我在$scope.BillingDetails 中得到emailcellphone 属性 好吧——我不想要的。

  • angular.copy 覆盖 $scope.BillingDetails 我输了addressline, cityzipcode 来自 $scope.BillingDetails——我不想要的。

我想要我的 update 函数做的是它应该使 $scope.BillingDetails 等于下面的对象:

{
    firstname : 'Ruchir',
    middlename : 'Shakun',
    lastname : 'Gupta',
    addressline : undefined,
    city : undefined,
    zipcode : undefined    
}

这个场景只是一个例子。为了缩短我的问题的长度,我只提到了 5-6 个属性。事实上,我必须处理 20 多个属性,而且都是动态的。因此,将 firstnamemiddlenamelastnameProfile 复制到 BillingDetails 的一对一属性对我不起作用。 我能做什么?

【问题讨论】:

  • $scope.BillingDetails.firstname = $scope.Profile.firstname 怎么样?
  • 您可以创建一个具有所需属性的附加 json 对象并设置值。所以你可以$scope.BillingDetails 扩展这个额外的 json 对象。也许不漂亮,但它可以提供帮助。

标签: javascript angularjs angularjs-directive angularjs-scope angularjs-service


【解决方案1】:

简单。只需像这样分配它们:

$scope.update = function() {
    $scope.BillingDetails.firstname = $scope.Profile.firstname;
    $scope.BillingDetails.middlename = $scope.Profile.middlename;
    $scope.BillingDetails.lastname = $scope.Profile.lastname;
}

我真的想不出更直接的方法来将几个属性从一个对象复制到另一个对象。

由于你需要复制超过 3 个属性,你可以试试这个:

$scope.update = function() {
    // Add the properties you want to copy to this array.
    var properties = ['firstname', 'middlename', 'lastname'];
    for(var i = 0; i < properties.length; i++){
         $scope.BillingDetails[properties[i]] = $scope.Profile[properties[i]];
    }
}

或者,将数组作为参数传递:

$scope.update = function(properties) {
    for(var i = 0; i < properties.length; i++){
         $scope.BillingDetails[properties[i]] = $scope.Profile[properties[i]];
    }
}

$scope.update(['firstname', 'middlename', 'lastname']);

【讨论】:

  • 对不起,这只是一个例子。为了缩短我的问题的长度,我只提到了 5-6 个属性。我必须处理 20 多个属性,而且都是动态的。所以它不会以这种方式对我有用。无论如何,感谢您尝试帮助我!
  • 哦,你应该在问题中提到这一点。我看看能不能写点东西。
  • @RuchirGupta:查看我的最后一个代码块。只是一个小调整。
  • @RuchirGupta:你应该提到的另一个细节......在这种情况下,Tip-Sy 的回答应该有效......
  • @Cerbrus 你说得对,OP 在他的问题中遗漏了许多细节。我试图猜测他真正想要什么,这就是我想出另一个答案的方式。但你的也值得一票,你来了!
【解决方案2】:

实际上,您尝试使用 Profile 的值更新 BillingDetails,因为它们具有共同的属性,对吗?

如果您可以使用null 而不是undefined 更改BillingDetails 的默认值,您可以尝试以下代码:

$scope.BillingDetails = {
    firstname : null,
    middlename : null,
    lastname : null,
    addressline : null,
    city : null,
    zipcode : null
}

$scope.update = function() {
    for(var key in $scope.Profile) {
        if(typeof $scope.BillingDetails[key] !== 'undefined') {
            $scope.BillingDetails[key] = $scope.Profile[key];
        }
    }
}

【讨论】:

    【解决方案3】:

    你可能会遇到这样的事情:

    $scope.update = function() {
      _update($scope.Profile, $scope.BillingDetails);
    }
    
    function _update(srcObj, destObj) {
      for (var key in destObj) {
        if(destObj.hasOwnProperty(key) && srcObj.hasOwnProperty(key)) {
          destObj[key] = srcObj[key];
        }
      }
    }
    

    plunker

    【讨论】:

    • 谢谢!恕我直言,使用hasOwnProperty 比@Tip-Sy 给出的解决方案要好
    • 干杯 - 尽管他也很友好地用他的代码提供了解释! ;) 希望以上内容仍然是不言自明的。
    • 澄清一下,以防它对某人有所帮助:使用myObj.hasOwnProperty('propertyName')'propertyName' in myObj 都可以在现有属性上工作,而无需检查它们是否有nullundefined 等;但是使用hasOwnProperty 将忽略obj 的继承属性,这与in 不同,这通常是您想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 2018-02-01
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    相关资源
    最近更新 更多