首页 > 解决方案 > 用不同的标识符替换对象属性名称

问题描述

事情是这样的。我想用这个控制器在angular.forEach中用if-else条件覆盖一个对象,基本上“k1”有一个原始关键字,我想用一个新关键字替换它。您认为显示新输入对象的最佳方式是什么?

$scope.SubmitKeyword = function (key, new_keyword) {
    console.log(key, new_keyword)
    $scope.new_keyword = new_keyword;

    if ($scope.new_keyword == null || $scope.new_keyword == undefined || $scope.new_keyword == "") {
        alert('Invalid input!')
        return
    }

    angular.forEach($scope.new_campaign_keywords, function (v, k) {
        console.log(v,k)
        if (k == key) {
            if (v['orig_keyword'] == new_keyword) {
                alert('No Changes Found!')
                return              
            } else {        
                console.log('changes detected')
                var a = 0;  
                angular.forEach($scope.campaigns, function (v1,k1) {
                    a++
                    console.log(k1)
                    if (k1 == a) {                      
                        //display the new keyword
                        else {
                            //remain the original keyword
                            }
                            }           
                })
            }
            }   
        })

    };

在此处输入图像描述 在此处 输入图像描述

标签: javascriptangularjsobject

解决方案


你有不同的选择来做到这一点,如果你使用的是 ES6 或 Typescript,你可以使用扩展运算符仅从 Object 复制某些属性

let obj= { bar: true, foo1: true, foo2:true};
if(someValidation){
  let { bar, ...rest} = obj;
  obj = {
   ...rest,
   newKey: bar, //or whatever value/key you want
 }
}

现在,由于我仅在您的代码示例中看到 ES5 代码,因此我认为您使事情变得有些复杂,首先,使用 forEach 修改您正在迭代的同一个数组并不是一个好主意。

使用地图功能并在那里进行更改。您可以使用delete运算符来消除您不想要的属性,但众所周知这会带来一些性能问题,所以让我们采用这种方法:

$scope.campaigns = $scope.campaigns.map(function (v) {
                        a++
                        if (condition) {                      
                           return {
                             newBar: v.bar,
                             foo1: v.foo1,
                             foo2: v.foo2,
                           };
                        }
                        return v;
                    });

另一个好处是,现在您正在创建一个新数组并替换当前$scope变量值一次,而不是修改每个元素,因为地图返回值将在新列表创建后完成。

如果您需要动态地迭代键,您可以使用Object.keys它们来迭代它们并执行相同的方法,创建一个新对象并将其返回到映射,或返回相同的初始对象。


推荐阅读