用JavaScript映射值的更有效方法



我有以下JS函数:

let mapFunc = (key) => {
let map = {
a: 'first',
b: 'first',
c: 'first',
d: 'second',
e: 'second',
f: 'second'
}
return map[key];
}
console.log(mapFunc('b'))

有没有一种方法可以让我写这个函数,这样我就只有2个属性,而不是6个不同的属性,比如这样?

{
first: ['a', 'b', 'c']
second: ['d', 'e', 'f']
}

mapFunc使用当前的6个属性映射总是会更快。

使用第二个数据结构,您必须对每个条目进行迭代,以确定它是否包含给定的值:

const mapFunc = (key) => {
const map = {
first: ['a', 'b', 'c'],
second: ['d', 'e', 'f']
};
return Object.keys(map).find(aKey => map[aKey].includes(key));
};
console.log(mapFunc('b'));

您可以通过使用Set而不是每个属性的数组来对此进行一点优化,但它仍然会比您的原始代码慢:

// `map` is created outside of `mapFunc` to initialize it only once.
const map = {
first: new Set(['a', 'b', 'c']),
second: new Set(['d', 'e', 'f'])
};
const mapFunc = (key) => {
return Object.keys(map).find(aKey => map[aKey].has(key));
};
console.log(mapFunc('b'));

您可以考虑将所需格式转换为原始格式,并像现在这样使用:

const compact_map = {
first: ['a', 'b', 'c'],
second: ['d', 'e', 'f']
};
const convert_map = (map) =>
Object.fromEntries(
Object.entries(map)
.flatMap(
([key, values]) => values.map((value) => [value, key])
)
);
const map = convert_map(compact_map);
let mapFunc = (key) => {
return map[key];
};
console.log(mapFunc('b'));
console.log(mapFunc('d'));
console.log(mapFunc('j'));

请注意:这可能只是一个好主意,在这种情况下,你可以安排事情,这样你只需要做一次地图转换。如果你能做到这一点,那么你就有了一个高效的数据结构(开发者填充/更新它)和一个计算高效的方法(mapFunc函数)。

可能对正则表达式和三元运算符使用不同的方法?

const mapFunc = (k) => /b(a|b|c)b/.test(k) ? 'first' : /b(d|e|f)b/.test(k) ? 'second' : null;
console.log(mapFunc('a')); 
console.log(mapFunc('d'));
console.log(mapFunc('j'));
console.log(mapFunc('abc'));

最新更新