Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 合并JSON数据总计_Angular_Typescript_Angular5 - Fatal编程技术网

Angular 合并JSON数据总计

Angular 合并JSON数据总计,angular,typescript,angular5,Angular,Typescript,Angular5,我这里有一个Stackblitz.com示例,我需要合并用户总数,比如dbrown或qadmin,而不是在单独的行中显示它们。它当前显示的结果如下所示: User Success Failure dbrown 16 0 qadmin 4 0 dbrown 4 1 qadmin 21 2 administrator 42 0 cooper 8 0 ad.brown 7 0 combineUserTotals() { let result: an

我这里有一个Stackblitz.com示例,我需要合并用户总数,比如dbrown或qadmin,而不是在单独的行中显示它们。它当前显示的结果如下所示:

User    Success Failure
dbrown  16  0
qadmin  4   0
dbrown  4   1
qadmin  21  2
administrator   42  0
cooper  8   0
ad.brown    7   0
combineUserTotals() {
  let result: any, results: any[] = [];

  this.users.map((user) => {
    result = results.find(u => u.UserName == user.UserName);

    if (!result)
      results.push({ UserName: user.UserName, Success: Number(user.Success), Failed: Number(user.Failed) });
    else {
      result.Success += Number(user.Success);
      result.Failed += Number(user.Failed);
    }
  });

  return results;
}
dbrown的总数应该是20和1,qadmin的总数应该是25和2。从代码中可以看出,它只是在遍历users变量。以下是app.component.ts:

import { Component } from '@angular/core';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {
  name = 'Angular 5';
  users: any[] = [];
  items: any;

  ngOnInit() {
    this.items = {"Users":{"InteractiveLogon":[{"UserName":"dbrown","Success":"16","Failed":"0"},{"UserName":"qadmin","Success":"4","Failed":"0"}],"NetworkLogon":[{"UserName":"dbrown","Success":"4","Failed":"1"},{"UserName":"qadmin","Success":"21","Failed":"2"},{"UserName":"administrator","Success":"42","Failed":"0"},{"UserName":"cooper","Success":"8","Failed":"0"},{"UserName":"ad.brown","Success":"7","Failed":"0"}]}};

    for (let user of this.items.Users.InteractiveLogon)
      this.users.push(user);

    for (let user of this.items.Users.NetworkLogon)
      this.users.push(user);
  }

}
下面是app.component.html:

<hello name="{{ name }}"></hello>
<p>
  Start editing to see some magic happen :)
</p>
<hr>
<table *ngIf="users">
  <thead>
    <tr>
      <th align=left>User</th>
      <th>Success</th>
      <th>Failure</th>
    </tr>
  </thead>
    <tr *ngFor="let row of users" >
      <td style="padding-right: 15px">{{row.UserName}}</td>
      <td>{{row.Success}}</td>
      <td>{{row.Failed}}</td>
    </tr>
</table>

您可以通过用户名将用户添加到地图:

const map = {};
for (let user of this.items.Users.InteractiveLogon)
  if (!map[user.UserName]) {
     map[user.UserName] = user;
  } else {
     map[user.UserName].Success += user.Success;
     map[user.UserName].Failed += user.Failed;
  }
}
for (let user of this.items.Users.NetworkLogon)
  if (!map[user.UserName]) {
     map[user.UserName] = user;
  } else {
     map[user.UserName].Success += user.Success;
     map[user.UserName].Failed += user.Failed;
  }
}
然后将您的项目重新添加到列表中

for (let key in map) {
  if (map.hasOwnProperty(key)) {
     this.users.push(map[key]);
  }
}

您可以通过用户名将用户添加到地图:

const map = {};
for (let user of this.items.Users.InteractiveLogon)
  if (!map[user.UserName]) {
     map[user.UserName] = user;
  } else {
     map[user.UserName].Success += user.Success;
     map[user.UserName].Failed += user.Failed;
  }
}
for (let user of this.items.Users.NetworkLogon)
  if (!map[user.UserName]) {
     map[user.UserName] = user;
  } else {
     map[user.UserName].Success += user.Success;
     map[user.UserName].Failed += user.Failed;
  }
}
然后将您的项目重新添加到列表中

for (let key in map) {
  if (map.hasOwnProperty(key)) {
     this.users.push(map[key]);
  }
}

您可以查看用户是否在用户数组中,如果不在,则推送它,否则将值添加到现有的数组中。由于您的值是字符串,因此必须使用parseIt()转换它们,以便它们求和

for (let user of this.items.Users.InteractiveLogon) {
  let _user = this.users.find( u => u.UserName == user.UserName );
  if ( _user ){
    _user.Success = parseInt(_user.Success) + parseInt(user.Success);
    _user.Failed = parseInt(_user.Failed) + parseInt(user.Failed);
  }
  else {
    this.users.push(user);
  }
}
for (let user of this.items.Users.NetworkLogon) {
  let _user = this.users.find( u => u.UserName == user.UserName );
  if ( _user ){
    _user.Success = parseInt(_user.Success) + parseInt(user.Success);
    _user.Failed = parseInt(_user.Failed) + parseInt(user.Failed);
  }
  else {
    this.users.push(user);
  }
}
结果

User    Success Failure
dbrown  20  1
qadmin  25  2
administrator   42  0
cooper  8   0
ad.brown    7   0

您可以查看用户是否在用户数组中,如果不在,则推送它,否则将值添加到现有的数组中。由于您的值是字符串,因此必须使用parseIt()转换它们,以便它们求和

for (let user of this.items.Users.InteractiveLogon) {
  let _user = this.users.find( u => u.UserName == user.UserName );
  if ( _user ){
    _user.Success = parseInt(_user.Success) + parseInt(user.Success);
    _user.Failed = parseInt(_user.Failed) + parseInt(user.Failed);
  }
  else {
    this.users.push(user);
  }
}
for (let user of this.items.Users.NetworkLogon) {
  let _user = this.users.find( u => u.UserName == user.UserName );
  if ( _user ){
    _user.Success = parseInt(_user.Success) + parseInt(user.Success);
    _user.Failed = parseInt(_user.Failed) + parseInt(user.Failed);
  }
  else {
    this.users.push(user);
  }
}
结果

User    Success Failure
dbrown  20  1
qadmin  25  2
administrator   42  0
cooper  8   0
ad.brown    7   0

下面是Javascript中的酷孩子们是如何做事的:

所以redue是一种非常有用的方法,可以在不使用forloops的情况下处理数组。我知道您不知道reduce是如何工作的,但请查看以下链接:

现在,要添加重复项:

 let result = [];
 this.users.map((a)=> {
    if (!this[a.UserName]) {
        this[a.UserName] = { UserName: a.UserName, Success: 0, Failed: 0 };
        result.push(this[a.UserName]);
    }
    this[a.UserName].Success += Number(a.Success);
    this[a.UserName].Failed += Number(a.Failed);
}, Object.create(null));
this.users = result;

下面是Javascript中的酷孩子们是如何做事的:

所以redue是一种非常有用的方法,可以在不使用forloops的情况下处理数组。我知道您不知道reduce是如何工作的,但请查看以下链接:

现在,要添加重复项:

 let result = [];
 this.users.map((a)=> {
    if (!this[a.UserName]) {
        this[a.UserName] = { UserName: a.UserName, Success: 0, Failed: 0 };
        result.push(this[a.UserName]);
    }
    this[a.UserName].Success += Number(a.Success);
    this[a.UserName].Failed += Number(a.Failed);
}, Object.create(null));
this.users = result;


我正在努力理解你的问题。你会在html中只有一行代码,还是除了求和(n+(n-1)),你会有所有的用户?不在乎。但是我认为最好在typescript代码中的users变量中组合用户。我试图理解你的问题。你会在html中只有一行代码,还是除了求和(n+(n-1)),你会有所有的用户?不在乎。但是我认为最好在typescript代码中的users变量中组合用户。for循环的第2-5行似乎没有添加到this.users变量中?但这段代码似乎确实有效!我知道它是有效的,因为我先在你的SB中试用了它,然后在这里复制了它。我认为这是太多的代码,必须有一种方法来做它更简单,虽然更难理解。我在看c#中的并行for,但在typescript中似乎没有等效项。谢谢,我喜欢您结合答案解决它的方式。for循环的第2-5行似乎没有添加到this.users变量中?但这段代码似乎确实有效!我知道它是有效的,因为我先在你的SB中试用了它,然后在这里复制了它。我认为这是太多的代码,必须有一种方法来做它更简单,虽然更难理解。我在看c#中的并行for,但在typescript中似乎没有对等的。谢谢,我喜欢你结合答案解决它的方式。这使dbrown的成功总数达到164,qadmin的成功总数达到421,但我认为这是因为它将数字视为字符串。我似乎找不到解决问题的方法,甚至将Number或parseInt应用于Success/Failed属性。@sfors哈哈,糟糕的是我没有注意到它。只要抛出一堆parseInt(),就可以解决问题了^^这会使dbrown的成功总数达到164,qadmin的成功总数达到421,但我认为这是因为它将数字视为字符串。而且我似乎找不到解决问题的方法,甚至对成功/失败的属性应用Number或parseInt。@sfors Haha,唉,糟糕的是,我没有注意到。只要抛出一堆parseInt()就可以解决问题了^^^这是一种很酷的方法来汇总所有内容,非常类似于我附加的第二个链接,它使用了reduce,但并没有解决我的问题。我不需要合计所有内容-我需要合并具有相同用户名的用户总数..this.users=[…this.items.users.NetworkLogon,…this.items.users.InteractiveLogon];这令人困惑。我使用this.users=this.items.users.NetworkLogon.concat(this.items.users.InteractiveLogon);相反,那很好。它被称为扩展运算符。这是时髦的孩子们在ES6+lol中的表现。这可能是基于map使用的最好答案,并且没有循环,我能够让它正确地合计结果。另外,感谢您指导如何更好地使用JS函数和运算符来完成此任务。@sfor没有问题。我们是来帮忙的。如果有机会,请参加我的javascript es6+课程。这是一个很酷的方法来汇总所有内容,非常类似于我附加的第二个链接,它使用了reduce,但它并没有解决我的问题。我不需要合计所有内容-我需要合并具有相同用户名的用户总数..this.users=[…this.items.users.NetworkLogon,…this.items.users.InteractiveLogon];这令人困惑。我使用this.users=this.items.users.NetworkLogon.concat(this.items.users.InteractiveLogon);相反,那很好。它被称为扩展运算符。这是时髦的孩子们在ES6+lol中的表现。这可能是基于map使用的最好答案,并且没有循环,我能够让它正确地合计结果。另外,感谢您指导如何更好地使用JS函数和运算符来完成此任务。@sfor没有问题。我们是来帮忙的。如果有机会,请参加我的javascript es6+课程。