gpt4 book ai didi

javascript - lodash 按数组的属性数组过滤

转载 作者:搜寻专家 更新时间:2023-11-01 05:29:47 27 4
gpt4 key购买 nike

我有一组具有属性数组“权限”的用户,我想过滤掉具有特定权限的用户。我想按数组过滤,所以如果我想要所有具有完全权限 ['full'] 的用户或具有完全和编辑 ['full','edit'] 的用户。我对使用 lodash 还很陌生,我想我可以将一些链接在一起,但我不确定是否有更有效的方法。

这是我的 plunker:http://plnkr.co/edit/5PCvaDJaXF4uxRowVBlK?p=preview

结果['完整']:

[{
"name": "Company1 Admin",
"rights": [
"full"
]
},
{
"name": "FullRights Company1",
"rights": [
"full","review"
]
}]

结果['完整','编辑']:

[{
"name": "Company1 Admin",
"rights": [
"full"
]
},
{
"name": "FullRights Company1",
"rights": [
"full","review"
]
},
{
"name": "EditRights Company1",
"rights": [
"edit"
]
}]

代码:

var users = [
{
"name": "Company1 Admin",
"rights": [
"full"
]
},
{
"name": "FullRights Company1",
"rights": [
"full","review"
]
},
{
"name": "ApproveRights Company1",
"rights": [
"approve","review"
]
},
{
"name": "EditRights Company1",
"rights": [
"edit"
]
},
{
"name": "ReviewRights Company1",
"rights": [
"review"
]
},
{
"name": "NoRights Company1",
"rights": [
"none"
]
}
];

var tUsers = [];
var filterRights = ['full','edit'];
_.forEach(users, function(user) {
if (_.intersection(user.rights, filterRights).length > 0) {
tUsers.push(user);
}
}) ;

//console.log('users', JSON.stringify(users, null, 2));
console.log('tUsers', JSON.stringify(tUsers, null, 2));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.min.js"></script>

最佳答案

来自docs

_.filter(collection, predicate, thisArg);

Arguments

  • collection (Array|Object|string): The collection to iterate over.

  • [predicate=_.identity] (Function|Object|string): The function invoked per iteration.

  • [thisArg] (*): The this binding of predicate.


当您想要连接不同的处理步骤时,链接非常有用。

如果你的问题陈述是

  1. 按权限过滤
  2. 按年龄最大的人排序
  3. 拿10个

那么链接就很有意义了。

这个问题似乎主要是关于过滤的自定义逻辑。

var users = [/* Your user data here */];
function filterByRights (users, rights) {
return _.filter(users, function (user) {
return _.any(user.rights, function (right) {
return _.contains(rights, right);
});
});
}
filterByRights(users, ['full', 'edit']); // [/*Users with full or edit rights*/]

我认为我的示例很好,因为它不依赖于条件逻辑。它使用 lodash 定义的方法,如 anycontains


性能问题

我想详细说明您对性能的担忧。这里有几点。

  • 您的问题代码维护其自身的用户过滤机制。虽然这是一个非常好的解决方案,但您应该选择让维护 lodash 的人处理这个逻辑。他们可能花了很多时间来优化如何从原始数组创建另一个数组。

  • _.any_.intersection 更有效。 _.intersection 需要处理每个元素才能知道交集是什么。 _.any 在遇到第一个通过谓词的元素时停止,否则它会检查每个元素。这一点是次要的,因为有少量的“权利”

  • 我给出的示例可能更符合“lodash 标准”。您通常可以完全使用 lodash 定义的方法和普通谓词进行数据转换。

关于javascript - lodash 按数组的属性数组过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34445991/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com