Javascript 从数组返回对象时是否排除属性?

Javascript 从数组返回对象时是否排除属性?,javascript,object,Javascript,Object,上面返回所有已连接的用户,这是为我的应用程序构建api,只有管理员可以访问此路由,并且密码已加密,但我想将他们从请求中排除。那么,如何过滤排除密码属性的对象呢?您可以使用 var users = [ {name: tim, password: 123, connected: true}, {name: jim, password: 345, connected: true}, {name: kim, password: 678, connected: true, ad

上面返回所有已连接的用户,这是为我的应用程序构建api,只有管理员可以访问此路由,并且密码已加密,但我想将他们从请求中排除。那么,如何过滤排除密码属性的对象呢?

您可以使用

var users = [
    {name: tim, password: 123, connected: true}, 
    {name: jim, password: 345, connected: true}, 
    {name: kim, password: 678, connected: true, admin: true}, 
    {name: pim, password: 91011}
];

var connectedUsers = users.filter(function( connectedUser ) {
    if(!connectedUser.admin) {
        return connectedUser.connected;
        //not sure how to return the connected users object without the password attr
    }
});
filter()
用于过滤条目;也就是说,如果您为某个条目返回true,它将包含在结果中,否则将被删除。因此,不能使用
filter()
转换输入。相反,您应该
将过滤结果映射到不带密码的对象:

var用户=[
{name:'tim',password:'123',connected:true},
{姓名:'jim',密码:'345',已连接:true},
{name:'kim',password:'678',connected:true,admin:true},
{名称:'pim',密码:'91011'}
];
users.filter(函数(connectedUser){
return!connectedUser.admin&&connectedUser.connected;
}).map(函数(用户){
//返回{name:user.name,connected:user.connected}
//_uuu或__
//EDIT1:您可以按以下方式仅删除一个
//字段,如果用户对象非常大。您还可以
//使用JQuery的clone()方法而不是stringify/parse。
userCopy=JSON.parse(JSON.stringify(用户))
删除userCopy.password
返回用户副本
})
另外,我对你的过滤功能做了一个小小的改变。

你应该过滤数组从每个元素中删除密码。您可以通过创建不带密码属性的新使用对象来完成此操作:

delete connectedUser.password;

但是,它会从原始数组中删除密码。我想这不是问题,除非他在返回连接用户列表(这不是不可能的,但有点奇怪)后将数组持久化。不,密码只需要保留在数据库中,我使用mongodb获取数据库中的所有用户,并过滤连接的用户模型。因此,基本上是从数据库中的对象创建一个新对象。我是在返回之前把它放进去还是怎么做?我试着像
if(!currentUser.admin){delete currentUser.password;return currentUser.connected;}
一样在apiOh中返回密码,我明白了,你为什么不把这个逻辑写成db查询?如果不是,在让connectedUsers数组遍历项目并删除密码后,db查询仍然是一种更干净、更安全的方法,为什么因为我需要将该对象传递到
res.json
?我喜欢它,但必须有一个更简单的方法来排除密码,因为在我的真实代码中,我发送了很多属性,不想映射每个属性。除此之外,谢谢。如果你有许多属性要包含,你可以简单地克隆你的对象并删除密码。查看我在代码中添加的注释如果您只想删除100个其他属性中的一个字段,则需要创建用户对象的副本,然后删除密码属性。否则,您将从原始数组中删除一个字段userCopy=JSON.parse(JSON.stringify(user))`为您复制对象。然后你删除密码并返回修改过的副本(里面没有密码)啊,这很有意义,现在正在进行的很多事情,我很感激所花费的时间,我相信这会起作用。所以使用.map而不是filter?不,像现在一样使用filter,然后将.map链接到过滤器的结果。啊,好的,现在尝试之前从未使用过会修改原始数组的map。如果不想重新创建对象,则不想将其从原始数组中删除。那么,你复制原始数组怎么样?我只是在这一点上困惑lol
var connectedUsers = users.filter(function(user) {
    // ...
})
.map(function(user) {
    var newUser = {}, key;
    for (key in user) {
        if (key !== 'password') {
            newUser[key] = user[key];
        }
    }
    return newUser;
});