首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Angular 6,从对象中获取新对象

Angular 6,从对象中获取新对象
EN

Stack Overflow用户
提问于 2019-11-14 23:06:02
回答 4查看 81关注 0票数 0

我的列表

代码语言:javascript
复制
defaultUsers: any[] = [
  {id: 31, name: "A"},
  {id: 32, name: "B"},
  {id: 33, name: "C"},
  {id: 34, name: "D"},
  {id: 35, name: "E"},
  {id: 36, name: "F"},
  {id: 37, name: "G"},
  {id: 38, name: "H"},
];

onlineUsers: any[]= [
  {userid: 31, platform: 'web'},
  {userid: 31, platform: 'mobil'},
  {userid: 32, platform: 'mobil'},
];

users: any[];

我的函数,

代码语言:javascript
复制
test(){
  let isOnline: boolean, isWeb: boolean, isMobile: boolean;

   this.users = this.defaultUsers.map(user=>{
    isOnline = this.onlineUsers.some((onlineUser: { userid: number; })=> onlineUser.userid == user.id);      

    -- ( ! help-> I could not build the structure in my head) --

    return {...user, online: isOnline }
   });

   console.log(this.users)
  }

我想要得到:

代码语言:javascript
复制
[
{id: 31, name: "A", mobile: true, web: true, online: true },
{id: 32, name: "B", mobile: true, web: false, online: true },
{id: 33, name: "C", mobile: false, web: false, online: false },
{id: 34, name: "D", mobile: false, web: false, online: false },
{id: 35, name: "E", mobile: false, web: false, online: false },
{id: 36, name: "F", mobile: false, web: false, online: false },
{id: 37, name: "G", mobile: false, web: false, online: false },
{id: 38, name: "H", mobile: false, web: false, online: false },
]

我如何才能以最准确和最高效的方式确保这一点?你能帮帮我吗?我想使用手中的对象来获得我想要的对象。

EN

回答 4

Stack Overflow用户

发布于 2019-11-14 23:29:44

您可以使用.filter()onlineUsers检索用户并查找平台类型:

代码语言:javascript
复制
  test() {
    let isOnline: boolean, isWeb: boolean, isMobile: boolean;

    this.users = this.defaultUsers.map((u) => {
      const users = this.onlineUsers.filter((onlineUser: { userid: number; platform: string; }) => onlineUser.userid == u.id);

      const isOnline = !!users.length;
      const isWeb = users.some((usr) => usr.userid === u.id && usr.platform === 'web');
      let isMobile = users.some((usr) => usr.userid === u.id && usr.platform === 'mobil');

      return { ...u, online: isOnline, web: isWeb, mobile: isMobile }
    });

    console.log(this.users)
  }

现场演示:here

票数 2
EN

Stack Overflow用户

发布于 2019-11-15 00:07:06

您可以使用reduceforEach来实现这一点。首先,迭代defaultUsers数组,然后循环forEach,以确定用户是onlineisMobile还是/和isWeb。在性能方面,你只做了一个嵌套的循环。

代码语言:javascript
复制
  this.users = this.defaultUsers.reduce((arr, user) => {
    let isOnline = false;
    let isWeb = false;
    let isMobile = false;
    this.onlineUsers.forEach((onlineUser) => {
      if (onlineUser.userid === user.id) {
        isOnline = true;
        if (onlineUser.platform === 'web') {
           isWeb = true;
        }
        if (onlineUser.platform === 'mobil') {
           isWeb = true;
        }
      }
    })
    let object = { online: isOnline, web: isWeb, mobile: isMobile }
    arr.push(Object.assign({}, user, object))
    return arr;
  }, [])
票数 1
EN

Stack Overflow用户

发布于 2019-11-14 23:34:14

下面的代码应该可以解决这个问题:

代码语言:javascript
复制
test() {
  this.users = this.defaultUsers.map(user=>{
    const id = user.id;
    const name = user.name;
    const mobile = this.onlineUsers.some(onUser => 
      user.id === onUser.id && onUser.plattform === 'mobile'
    );
    const web = this.onlineUsers.some(onUser => 
      user.id === onUser.id && onUser.plattform === 'web'
    );
    const online = mobile || web;
    return {id, name, mobile, web, online};
  });   
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58859881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档