javascript - 用不同的标识符替换对象属性名称
问题描述
事情是这样的。我想用这个控制器在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
}
}
})
}
}
})
};
解决方案
你有不同的选择来做到这一点,如果你使用的是 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
它们来迭代它们并执行相同的方法,创建一个新对象并将其返回到映射,或返回相同的初始对象。
推荐阅读
- angular - 带有 CDK 表/材料设计的表中的单选按钮
- ios - 如何使用 UICollectionView 的 selectItem 在 collectionView 单元格上绘图?
- android - 无法弄清楚 Android 中的布局依赖项
- git - 手动创建标记,例如 git merge 与来自差异的冲突
- android - 升级到 Android Gradle 插件 3.3.0 时出现无效的 Crashlytics API 密钥错误
- java - 如何更新 jlist swing java
- java - 如何将现有文件移动到新包中?
- python - 是否可以使用 python 的 Pool.map() 获得交互式反馈
- c# - 如何正确使用 TransactionScope 和 Nunit
- scala - 使用 Ebean 玩 Scala 2.6:访问实体字段会使 OneToMany 关联为空