使用javascript更新循环内对象的值

时间:2018-05-23 08:37:58

标签: javascript arrays angularjs loops

我目前在代码方面遇到了困难。

首先,我有一个像[{Id:1, Name:"AML", allowedToView:"1,2"}, {Id:2, Name:"Res", allowedToView:"1"}...]这样的对象数组来自我的服务

我在变量$scope.listofResource

中分配它

然后在我的一个对象中,我有allowedToView个密钥,它是我用逗号分隔的用户ID的集合。

然后我有了这段代码......

的Javascript

$scope.listofResource = msg.data
for (var i = 0; i < msg.data.length; i++) {

首先我运行for循环,这样我就可以将Id's键中每个用户的allowedToView分开

    var allowed = msg.data[i].allowedToView.split(",");
    var x = [];

然后我创建了一个变量x,这样我就可以使用allowedId的键来推送一个新对象,基本上是用户的Id和resId的ID。资源

    for (var a = 0; a < allowed.length; a++) {
        x.push({ allowedId: allowed[a], resId: msg.data[i].Id });
    }

然后我把它放在Promise.all中,因为我必须使用服务获取“允许用户”的名称

    Promise.all(x.map(function (prop) {
        var d = {
            allowedId: parseInt(prop.allowedId)
        }

        return ResourceService.getAllowedUsers(d).then(function (msg1) {
            msg1.data[0].resId = prop.resId; 

此处返回允许用户的ID和名称。我必须插入resId,以便它可以传递给返回对象,它将显示在.then()下面

            return msg1.data[0]
        });
    })).then(function (result) {

我得到了我想要的结果,但现在这是我的问题

        angular.forEach(result, function (val) {
            angular.forEach($scope.listofResource, function (vv) {
                vv.allowedToView1 = [];
                if (val.resId === vv.Id) {
                    vv.allowedToView1.push(val);

我想更新应该包含对象数组的$scope.listofResource.allowedToView1,它基本上是允许用户的信息。但每当我在这里推送一个值vv.allowedToView1.push(val);它总是更新数组的最后一个对象。

                 }
             })
        })
   });
}

所以我的代码的结果总是这样 [{Id:1, Name:"AML", allowedToView:"1,2", allowedToView:[]}, {Id:2, Name:"Res", allowedToView:"1", allowedToView:[{Id:1, Name:" John Doe"}]}...]

第一个结果始终为空白。任何人都可以帮助我吗?

以下是它的掠夺者...... Plunkr

1 个答案:

答案 0 :(得分:0)

链接到解决方案 - Plunkr

for (var i = 0; i < msg.length; i++) {
  var allowed = msg[i].allowedToView.split(",");
  msg[i].allowedToView1 = [];
  var x = [];

正如Aleksey Solovey正确指出的那样,allowedToView1数组的初始化发生在错误的地方。它应该转移到为msg调用一次的地方。我已将它转移到第一个循环中的allowedToView.split之后,因为它似乎是初始化它的合适位置。