我需要从用户列表中获得唯一组的列表,其中每个用户都具有一个或多个不同级别的组的成员资格。这些级别构成了一个层次结构,我希望将其作为地址(有点像IP地址)保存在组中。用户必须属于该层次结构中的所有组,因此,例如,如果不成为上述所有组的成员,则不可能成为3级组的成员。我从不受控制的API获取用户列表,因此很遗憾,传入的结构无法更改。
给定以下用户列表示例:
const users = [
{
'Level 1': 'first',
'Level 2': 'second',
'Level 3': 'third'
},
{
'Level 1': 'first',
'Level 2': 'second',
'Level 3': 'another'
}
]
当调用类似函数时:const groups = getGroups(users})
它应该返回:
const expectedGroups = [
{
name: 'first',
address: '1'
},
{
name: 'second',
address: '1.1'
},
{
name: 'third',
address: '1.1.1'
},
{
name: 'another',
address: '1.1.2'
}
]
您可以按顺序获取对象的值,将对象用作可见名称的参考,并使用所有级别的信息为新名称添加添加新对象。
function getGroups(array) {
var result = [],
object,
levels = { max: 0, value: '' },
i, name, level, key;
for (object of array) {
i = 1;
key = `Level ${i}`;
level = levels;
while (key in object) {
name = object[key];
if (!level[name]) {
level[name] = { value: (level.value + (level.value && '.') || '') + ++level.max, max: 0 };
result.push({ name, address: level[name].value });
}
level = level[name];
key = `Level ${++i}`;
}
}
return result;
}
var users = [{ 'Level 1': 'first', 'Level 2': 'second', 'Level 3': 'third' }, { 'Level 1': 'first', 'Level 2': 'second', 'Level 3': 'another' }],
groups = getGroups(users);
console.log(groups);
.as-console-wrapper { max-height: 100% !important; top: 0; }
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句