搜索数组值为

时间:2018-01-18 07:55:18

标签: javascript performance search

我有这个对象:

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
         }
    }
}

我想知道是否有其他有效方法可以做到这一点。

2 个答案:

答案 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])