清理字符串数组中路径冲突的最快方法



这是一个很难解释的问题,但这里是。我需要清理一个"path"字符串数组,如果路径具有子属性,则不包括顶级属性。但只有子属性

E.g

[
'firstName',
'address',
'address.local.addressLine1',
'address.local.addressLine2',
'address.local',
]

应该变成:

[
'firstName',
'address.local.addressLine1',
'address.local.addressLine2',
'address.local',
]

到目前为止,我有一个相当详细的功能,但我想看看是否有比这个更优雅/更好的解决方案:

function cleanCollisions(array) {
var output = [];
// return [...new Set(array)];
var map = array.reduce(function(set, field) {
if (!Boolean(field)) {
return set;
}
////////////////
var rootKey = field.split('.')[0];
if(!set[rootKey]) {
set[rootKey] =[];
}
var count = field.split('.').length -1;
if(count) {
set[rootKey].push(field);
}

return set;
}, {})

for(const key in map) {
value = map[key];
if(value.length) {
output.push(value);
} else {
output.push(key);
}
}
////////////////
return output.flat();
}

我首先遍历数组,提取所有具有子属性的字符串的顶部属性,然后过滤掉所有这些顶部属性。

const input = [
'firstName',
'address',
'address.local.addressLine1',
'address.local.addressLine2',
'address.local',
];
const topLevelProps = new Set();
for (const str of input) {
const match = str.match(/^(.*?)./);
if (match) {
topLevelProps.add(match[1]);
}
}
const output = input.filter(str => !topLevelProps.has(str));
console.log(output);

CertainPerformance的答案变体,但使用filtermap而不是regex:

const paths = [
'firstName',
'address',
'address.local.addressLine1',
'address.local.addressLine2',
'address.local',
];
const roots = paths.filter(p => p.includes('.')).map(p => p.split('.')[0]);
const cleansed = paths.filter(p => p.includes('.') || !roots.includes(p));
console.log(cleansed);

最新更新