我的列表
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[];我的函数,
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)
}我想要得到:
[
{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 },
]我如何才能以最准确和最高效的方式确保这一点?你能帮帮我吗?我想使用手中的对象来获得我想要的对象。
发布于 2019-11-14 23:29:44
您可以使用.filter()从onlineUsers检索用户并查找平台类型:
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
发布于 2019-11-15 00:07:06
您可以使用reduce和forEach来实现这一点。首先,迭代defaultUsers数组,然后循环forEach,以确定用户是online和isMobile还是/和isWeb。在性能方面,你只做了一个嵌套的循环。
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;
}, [])发布于 2019-11-14 23:34:14
下面的代码应该可以解决这个问题:
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};
});
}https://stackoverflow.com/questions/58859881
复制相似问题