我有一个系统,我想在用户执行某些操作时向他们显示有用的消息。然而,根据用户的不同,如果我们知道他们已经熟悉特定的操作,我们可能会选择不显示消息。
我有两个多维数组,我需要比较它们,以确定是否应该显示消息。一个包含用户分类,另一个包含所有消息。
我的问题是,编码风格在可能的情况下更喜欢使用Lodash助手,我不太精通它。
下面的代码实现了我想要的功能,但它显然不够美观,性能也不高。
// user classification for each type of action
const classifications = [
{
status: 'basic',
actionTypes: [
'copy', 'paste'
],
},
{
status: 'basic',
actionTypes: [
'buy', 'sell'
],
},
{
status: 'professional',
actionTypes: [
'drag', 'drop'
],
}
];
// array of messages for each set of actions
const messages = [
{
message: 'foo',
actionTypes: [
'copy', 'paste'
],
},
{
message: 'bar',
actionTypes: [
'buy', 'sell'
],
},
{
message: 'baz',
actionTypes: [
'drag', 'drop'
],
}
];
// returns only messages for which the user is not professional
function getMappedMessages() {
const basicClassifications = _.filter(classifications, ['status', 'basic']);
const filteredMessages = [];
for (let i = 0; i < basicClassifications.length; i++) {
for (let j = 0; j < basicClassifications[i].actionTypes.length; j++) {
for (let k = 0; k < messages.length; k++) {
if (_.includes(messages[k].actionTypes, basicClassifications[i].actionTypes[j])) {
filteredMessages.push(messages[k]);
break;
}
}
}
}
return filteredMessages;
}
console.log(getMappedMessages());
<script src="https://cdn.jsdelivr.net/lodash/4/lodash.min.js"></script>
(Also available on JSBin)
正如你所看到的,每一组动作(例如“复制”和“粘贴”)都有一个消息,用户有一个对应的动作集和一个分类。如果分类不是专业的,我匹配两个内部数组(对于外部数组中的每个对象),并返回只包含“基本”消息的对象。
这两个数组很可能是相同的(所以我可以做一个直接的比较,也许用_.difference
?),但我不确定。
我如何使这个怪物更可读和性能?我应该做一些扁平化?
数据来自两个不同的端点,我不能修改结构。
4条答案
按热度按时间oxiaedzo1#
_.isEqual()
会做你想做的。至于清理它,我建议要么把它展平,要么把它分成几个函数,这样你至少可以更好地理解到底发生了什么。
whlutmcx2#
您可以使用
lodash#keyBy
将所有分类按其actionTypes
作为键进行索引。使用索引分类作为使用lodash#filter
保留不属于professional
状态的消息的一种方式。x一个一个一个一个x一个一个二个一个x一个一个三个一个
aelbi1ox3#
有很多方法可以改进代码。我做的第一件事是执行过滤器,Map,减少。
我必须以结果数组
m1
和m2
为例,它们都包含相同的元素。区别在于m2
是从ES6 Set派生的,但应该更快。lndjwyie4#
当然,大部分都可以在纯ES6/ES 7中实现。但是您要求使用
lodash
,因此这里有一些惯用的lodash
。链接非常酷,因为它基本上为您提供了一个值的 Package 器,这就是为什么当您使用
chain()
时,必须在最后调用value()
。它允许你按顺序链接任何你想要的
lodash
函数,你不受输出是数组或对象等的限制。