【问题标题】:Updating the value of an object inside a loop using javascript使用javascript更新循环内对象的值
【发布时间】:2018-05-23 08:37:57
【问题描述】:

我目前在编写代码时遇到了困难。

首先我有一个像 [{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 循环,这样我就可以在 allowedToView 键中分隔每个用户的 Id's

    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,因为我必须根据他们使用服务的 ID 来获取“允许用户”的名称

    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

【问题讨论】:

  • 将完整的代码 sn-p 放在一起,这样它也可以一次读取。在 JSFiddle 上复现问题会让其他人更容易更快地帮助你
  • 现在好了,先生。我已经把它放在 plunker 里了
  • 问题出在vv.allowedToView1 = [],你每次都在循环中覆盖它。您应该更改逻辑,以便数组的初始化将在循环之外

标签: javascript arrays angularjs loops


【解决方案1】:

解决方案链接 - Plunkr

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

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

【讨论】:

  • 哦,我完全想念它。谢谢 Aleksey Solovey 和@Mink。谢谢各位大佬
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-12
  • 1970-01-01
  • 1970-01-01
  • 2017-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多