2014-09-20 35 views
1
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 
    } 
}); 

上述返回所有连接的用户,这是为我的应用程序构建一个API,只有管理员可以访问此路线和密码加密,但我想排除他们的请求。那么如何过滤排除密码属性的对象呢?从数组中返回对象时排除属性?

+0

你不想重新创建对象,那么你不想从原始数组中删除。那么你如何复制原始数组? – andrex 2014-09-20 22:25:50

+0

我只是困惑在这一点lol – 2014-09-20 22:34:20

回答

0

可以使用

delete connectedUser.password; 
+0

但它会从原始数组中删除密码。 – nisargjhaveri 2014-09-20 22:18:11

+0

我想这不是一个问题,除非他在返回连接用户列表之后坚持数组(这不是强制性的,而是有点奇怪) – 2014-09-20 22:20:48

+0

没有密码只需要留在数据库中,我正在使用mongodb抓住数据库中的所有用户并过滤连接的用户模型。所以几乎从数据库中的一个对象创建一个新的对象。在我回来之前或之后,我是否会放这个? – 2014-09-20 22:22:25

1

filter()为过滤条目删除的每个用户的密码属性;即,如果您输入的结果中包含true,则返回true,否则结果将被删除。因此,您不能使用filter()来转换输入。相反,你应该map过滤结果的对象不passpword:

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'} 
]; 
users.filter(function(connectedUser) { 
    return !connectedUser.admin && connectedUser.connected; 
}).map(function(user) { 
    // return {name: user.name, connected: user.connected} 
    // __OR__ 
    // EDIT1: You can as the following to delete only one 
    // field if the user object is very large. You can also 
    // use JQuery's clone() method instead of stringify/parse. 
    userCopy = JSON.parse(JSON.stringify(user)) 
    delete userCopy.password 
    return userCopy 
}) 

PS。我对你的过滤器功能做了一个小改动。

+0

为什么因为我需要将该对象传递给'res.json'?我喜欢它,但是必须有一种更简单的方法来排除密码,因为在我的真实代码中,我发送了很多属性,并且不想映射每个属性。除此之外,谢谢。 – 2014-09-20 22:20:28

+0

如果要包含许多属性,则可以简单地复制对象并删除密码。请参阅我在代码 – 2014-09-20 22:31:02

+0

中添加的注释我很抱歉只是困惑,给我一点理解.. – 2014-09-20 22:37:12

1

您应该map已过滤的数组从每个元素中删除密码。您可以通过不使用密码属性创建新的使用对象做到这一点:

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; 
}); 
+0

那么用.map代替过滤器? – 2014-09-20 22:23:58

+0

不,使用使用过滤器就像你现在正在做的,然后链接.map到过滤器的结果。 – dfsq 2014-09-20 22:25:19

+0

ah好吧现在试用它之前从未使用地图 – 2014-09-20 22:26:14