UnderscoreJS - 从属于某个组的数组中拉取用户
UnderscoreJS - Pull users from an Array who are part of a group
我有一个组对象:
{groupid1: "metadata",
groupid2: "metadata"}
以及一组用户:
[
{
name: "something",
groups: ["groupid1", "groupid2"]
...},
{
name: "something else ",
groups: ["groupid1"]
...},
{
name: "something else again",
groups: ["groupid2"]
...},
]
我想遍历组 ID 并提取与该组 ID 匹配的用户列表,因此我最终记录了两个用户列表,每个组一个:
for (group in groups) {
var userArray = _.pluck(users, function(user) {
return user.groups.indexOf(group) > -1;
})
console.log(userArray);
}
问题是这返回给我一个未定义的数组,而不是一个用户对象数组。即使只返回用户名也很好。
感谢您提供的任何帮助!
对于可扩展性,下划线是解决这个问题的首选方法。
如 docs 中所述,_.pluck()
有两个参数:列表和 属性 名称 - 您提供的不是 属性 名称,而是一个函数。但更重要的是,这不是您使用 _.pluck()
函数的目的(再次检查文档)。
在你的情况下,你甚至根本不需要使用 UnderscoreJS:
// Your groups
const groups = {
groupid1: "metadata",
groupid2: "metadata"
};
// Your users
const users = [
{
name: "something",
groups: ["groupid1", "groupid2"],
},
{
name: "something else ",
groups: ["groupid1"]
},
{
name: "something else again",
groups: ["groupid2"]
}
];
// Get ids of the groups and loop through them
const result = Object.keys(groups).forEach(groupId => {
// Return only users whose groups array contains the groupId
const usersFound = users.filter(user => user.groups.indexOf(groupId) > -1);
// Log the users found
console.log(usersFound);
});
您的代码段存在问题,因为您使用的是 _.pluck
而不是 _.select
。
这是 underscore.js 解决方案:
const groups = {
groupid1: "metadata",
groupid2: "metadata"
};
const users = [{
name: "something",
groups: ["groupid1", "groupid2"]
},
{
name: "something else ",
groups: ["groupid1"]
},
{
name: "something else again",
groups: ["groupid2"]
},
];
_.each(_.keys(groups), group => {
const usersArray = _.select(users, user => {
return user.groups.indexOf(group) > -1;
});
console.log(usersArray);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js"></script>
根据此回答的评论回答作者的另一个问题:
I wanted to extend the question to push the results from both into a single array, and not include duplicates
const groups = {
groupid1: "metadata",
groupid2: "metadata"
};
const users = [{
name: "something",
groups: ["groupid1", "groupid2"]
},
{
name: "something else ",
groups: ["groupid1"]
},
{
name: "something else again",
groups: ["groupid2"]
},
];
let usersArray = [];
_.each(_.keys(groups), group => {
usersArray = _.union(usersArray, _.select(users, user => {
return user.groups.indexOf(group) > -1;
}));
});
console.log(usersArray);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js"></script>
我有一个组对象:
{groupid1: "metadata",
groupid2: "metadata"}
以及一组用户:
[
{
name: "something",
groups: ["groupid1", "groupid2"]
...},
{
name: "something else ",
groups: ["groupid1"]
...},
{
name: "something else again",
groups: ["groupid2"]
...},
]
我想遍历组 ID 并提取与该组 ID 匹配的用户列表,因此我最终记录了两个用户列表,每个组一个:
for (group in groups) {
var userArray = _.pluck(users, function(user) {
return user.groups.indexOf(group) > -1;
})
console.log(userArray);
}
问题是这返回给我一个未定义的数组,而不是一个用户对象数组。即使只返回用户名也很好。
感谢您提供的任何帮助! 对于可扩展性,下划线是解决这个问题的首选方法。
如 docs 中所述,_.pluck()
有两个参数:列表和 属性 名称 - 您提供的不是 属性 名称,而是一个函数。但更重要的是,这不是您使用 _.pluck()
函数的目的(再次检查文档)。
在你的情况下,你甚至根本不需要使用 UnderscoreJS:
// Your groups
const groups = {
groupid1: "metadata",
groupid2: "metadata"
};
// Your users
const users = [
{
name: "something",
groups: ["groupid1", "groupid2"],
},
{
name: "something else ",
groups: ["groupid1"]
},
{
name: "something else again",
groups: ["groupid2"]
}
];
// Get ids of the groups and loop through them
const result = Object.keys(groups).forEach(groupId => {
// Return only users whose groups array contains the groupId
const usersFound = users.filter(user => user.groups.indexOf(groupId) > -1);
// Log the users found
console.log(usersFound);
});
您的代码段存在问题,因为您使用的是 _.pluck
而不是 _.select
。
这是 underscore.js 解决方案:
const groups = {
groupid1: "metadata",
groupid2: "metadata"
};
const users = [{
name: "something",
groups: ["groupid1", "groupid2"]
},
{
name: "something else ",
groups: ["groupid1"]
},
{
name: "something else again",
groups: ["groupid2"]
},
];
_.each(_.keys(groups), group => {
const usersArray = _.select(users, user => {
return user.groups.indexOf(group) > -1;
});
console.log(usersArray);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js"></script>
根据此回答的评论回答作者的另一个问题:
I wanted to extend the question to push the results from both into a single array, and not include duplicates
const groups = {
groupid1: "metadata",
groupid2: "metadata"
};
const users = [{
name: "something",
groups: ["groupid1", "groupid2"]
},
{
name: "something else ",
groups: ["groupid1"]
},
{
name: "something else again",
groups: ["groupid2"]
},
];
let usersArray = [];
_.each(_.keys(groups), group => {
usersArray = _.union(usersArray, _.select(users, user => {
return user.groups.indexOf(group) > -1;
}));
});
console.log(usersArray);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.9.1/underscore-min.js"></script>