【问题标题】:Replacing object property name with different identifier用不同的标识符替换对象属性名称
【发布时间】:2019-12-03 11:52:48
【问题描述】:

事情是这样的。我想用这个控制器在 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
                            }
                            }           
                })
            }
            }   
        })

    };

enter image description here enter image description here

【问题讨论】:

    标签: javascript angularjs object


    【解决方案1】:

    使用hasOwnProperty方法检测属性的存在:

    $scope.SubmitKeyword = function (key, new_keyword) {
        var obj = $scope.new_campaign_keywords;
        console.log(key, new_keyword)
        $scope.new_keyword = new_keyword;
    
        if (!new_keyword)  {
            alert('Invalid input!');
            return;
        };
    
        if (obj.hasOwnProperty(new_keyword)) {
            alert('New keyword in use');
            return;
        };
    
        //ELSE
        console.log('changes detected');
    
        obj[new_keyword] = obj[key];
        delete obj[key];
    };
    

    使用delete 运算符删除旧关键字。

    【讨论】:

    • 确实有道理,谢谢,但我的模板上没有这个“关键字”对象,你认为我可以在哪里插入它以及我应该使用什么属性来使它工作。谢谢:)
    【解决方案2】:

    您有不同的选择来执行此操作,如果您使用的是 ES6 或 Typescript,您可以使用 spread operator 仅从 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 operator 来消除您不想要的属性,但众所周知这存在一些性能问题,所以让我们采用这种方法:

    $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 来迭代它们并执行相同的方法,创建一个新对象并将其返回到映射,或者返回相同的初始对象。

    【讨论】:

    • 我实际上对此一无所知哈哈我是java新手。所以你可以让它变得简单,或者你可以编辑我的代码并对其进行一些更改,那会很好。谢谢:)
    • @jodelaneferry 在最后一个代码示例中我正在为您拥有的 campaings 变量进行映射,这就像在 Java 中映射一个数组,但您返回一个新的 Object Literal 使用新的键名
    猜你喜欢
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 2016-01-04
    • 1970-01-01
    • 2014-08-17
    相关资源
    最近更新 更多