我有一个对象数组array = [object1, object2, ...]
,每个对象都有一些键object1 = { key1: 'value1', ... }
。我想以这种方式添加密钥:
$rootScope.array[i].newKey = 'someValue'
但有角度告诉我$rootScope.array[i]
是undefined
。
我从控制台注意到的是,对象获得了新密钥,但控制台仍然说明了相同的内容。
答案 0 :(得分:3)
您应该使用小于而不是小于或等于比较器。
$scope.init = function () {
for (i = 0; i < /* not <= */ $rootScope.meatTypes.length; i++) {
console.log("I am showing the meatypes:");
console.log($rootScope.meatTypes);
$rootScope.meatTypes[i].counter = '0';
counterOperations.setCounters(i, 0);
}
$rootScope.total = 0;
counterOperations.setTopCounter(0);
};
因为当i
等于$rootScope.meatTypes.length
时,$rootScope.meatTypes[i]
为undefined
。
答案 1 :(得分:2)
您正在尝试访问不存在的数组成员。
您需要创建一个新对象并将其推送到数组:
$rootScope.array.push({'key1': 'someValue'});
答案 2 :(得分:1)
你没有提到lodash,但当我看到有人遇到这样的问题时,我想提出使用lodash(或underscore.js)的建议。
使用lodash,您可以使用_.set执行此类操作,通过自动在路径中添加必要元素来防御您所描述的问题:
_.set($rootScope, ['array', i, 'newKey'], 'someValue');
正确使用此库,解决了设置和获取变量时可能遇到的许多问题,以及其他超级有用的工具。在我们的项目中,它对我们来说是一个重要的救命(并节省时间)。
答案 3 :(得分:0)
像这样你可以添加
$rootScope.array[i] = {}; // first we should create an object on that array location
$rootScope.array[i]['newKey'] = 'someValue'; // then only we can add values
修改强>
$scope.init = function () {
for (i = 0; i <= $rootScope.meatTypes.length; i++) {
console.log("I am showing the meatypes:");
console.log($rootScope.meatTypes);
**// This is needed**
$rootScope.meatTypes[i]={};// here we should tell that metaType[newItem] is an object other wise it treat it as undefined
$rootScope.meatTypes[i].counter = '0';
counterOperations.setCounters(i, 0);
}
$rootScope.total = 0;
counterOperations.setTopCounter(0);
};