使用包含对象的现有数组的键向对象添加键

时间:2016-03-30 14:35:13

标签: javascript arrays angularjs object

我有一个对象数组array = [object1, object2, ...],每个对象都有一些键object1 = { key1: 'value1', ... }。我想以这种方式添加密钥:

$rootScope.array[i].newKey = 'someValue'

但有角度告诉我$rootScope.array[i]undefined

我从控制台注意到的是,对象获得了新密钥,但控制台仍然说明了相同的内容。

4 个答案:

答案 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);
};