我有这个对象:
let units = {
"MPa" : ["mpa","megapascal", "mega pascal"],
"N*m" : ["n*m","newton meter"],
"Ohm" : ["ohm","ohms"],
...
}
我应该用另一个带有单词的字符串(在这种情况下为单位)搜索此对象。我已经提出了一个解决方案,但如果对象的大小增加则效率不高。我的解决方案是
for (let key in units) {
for (let val in units[key]) {
if (string.includes(units[key][val])) {
// some code
}
}
}
我想知道是否有其他有效方法可以做到这一点。
答案 0 :(得分:1)
如果没有更多细节,特别是if
声明中发生的事情,很难回答你的问题。
使用find
和其他过滤器可以有一个很好的方法。但需要更多信息。
这是你的代码,稍微清洁一点:
Object.keys(units)
.map(k => units[k])
.reduce((xs,ys) => xs.concat(ys), [])
.forEach(item => {
if (string.includes(item)) {...}
});
上面的 item
将按顺序排列"mpa","megapascal", "mega pascal", "n*m","newton meter", "ohm","ohms"
答案 1 :(得分:0)
假设您要使用"标准"替换单位的替代名称。名称,您可以使用此功能:
function harmoniseUnits(str, units) {
// store the relation in opposite direction:
// - key is the substring to be found, value is the standard unit
units = Object.entries(units).reduce( (acc, [unit, alts]) =>
Object.assign(acc, ...alts.map( alt => ({ [alt]: unit }) )),
{}
);
// turn this into a regular expression
const regex = new RegExp(
Object.keys(units)
// sort the terms putting the longest first
.sort( (a, b) => b.length - a.length )
// escape characters for use in regex
.map( alt => alt.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') )
// make them part of an OR-expression
.join('|'),
"gi");
// use a callback to replace the words with the standard unit code
return str.replace(regex, m => units[m])
}
// Example use:
const units = {
"MPa" : ["mpa","megapascal", "mega pascal"],
"N*m" : ["n*m","newton meter"],
"Ohm" : ["ohm","ohms"],
},
str = "We have 12 megapascal, while the resistance is just 0.4 ohms",
result = harmoniseUnits(str, units);
console.log(result);

它将units
对象预处理为"倒置"对象和相应的正则表达式。
如果您打算使用相同的units
对象来处理许多不同的字符串,那么最好只生成一个反转对象和正则表达式一次。准备好这两个元素后,您可以使用以下命令进行替换:
str.replace(regex, m => units[m])