javascript - 提高 JavaScript 函数的性能(使用数组查找)

标签 javascript arrays performance

我正在尝试完成代码挑战,我必须将手机 t9 输入的击键解码为字符以创建文本消息。主函数 (reverse_t9) 采用一串键,例如“44 444”或“999337777”,我需要将它们翻译成相应的文本(分别为“hi”或“yes”)。

我已完成所有逻辑并可以生成正确的输出,但挑战告诉我我超过了 4000 毫秒的时间限制。我找到了几个可以提高性能的地方,但仍然无法达到这个标准。我认为最浪费时间的是我的“getLetterFromDigits”函数,它必须遍历我的数组以找到一组击键的对应映射。

我是否遗漏了其他一些明显的性能问题?如果您需要更多信息,请告诉我。

function reverse_t9(keys) {
    var retVal = "";
    var maxKeystrokes = 3;
    var splitKeystrokes = splitKeystrokesBySpacesAndKeys(keys);

    for (i = 0, numSplits = splitKeystrokes.length; i < numSplits; i++){
        //console.log("THIS SPLIT:");
        //console.log(splitKeystrokes[i]);
        //console.log("THIS LETTER:");
        //console.log(getLetterFromDigits(splitKeystrokes[i]));
        retVal = retVal + getLetterFromDigits(splitKeystrokes[i]);
    }

    return retVal;
}

function splitKeystrokesBySpacesAndKeys(keys) {
    var retVal = [];
    var lastKey = "";
    var thisKey = "";
    var lastSplit = 0;
    var isSpace = 0;

    for (i = 0, numKeys = keys.length; i <= numKeys; i++) {

        thisKey = keys.substring(i, i + 1);

        if (i == 0) {
            // FIRST TIME AROUND, DO NOTHING ELSE, JUST ASSIGN LAST KEY
            lastKey = thisKey;
        } else {
            if (thisKey != lastKey) {
                if (thisKey != " ") {
                    if (lastKey != " ") {
                        retVal.push(keys.substring(lastSplit, i));
                    } else {
                        retVal.push(keys.substring(lastSplit, i - 1));
                    }

                    lastSplit = i;
                }

                lastKey = thisKey;

            } else {
                // KEY DID NOT CHANGE, ASSIGN LAST KEY AND CONTINUE ON
                lastKey = thisKey;
            }
        }
    }

    return retVal;
}

function getLetterFromDigits(digits){
    var retVal;

    var digitMapping = [
    {
        digit: "1",
        mapping: []
    },
    {
        digit: "2",
        mapping: ["a", "b", "c"]
    },
    {
        digit: "3",
        mapping: ["d", "e", "f"]
    },
    {
        digit: "4",
        mapping: ["g", "h", "i"]
    },
    {
        digit: "5",
        mapping: ["j", "k", "l"]
    },
    {
        digit: "6",
        mapping: ["m", "n", "o"]
    },
    {
        digit: "7",
        mapping: ["p", "q", "r", "s"]
    },
    {
        digit: "8",
        mapping: ["t", "u", "v"]
    },
    {
        digit: "9",
        mapping: ["w", "x", "y", "z"]
    },
    {
        digit: "0",
        mapping: ["*"]
    }

    ];

    var digit = digits.substring(0, 1);


    for (i = 0, numMappings = digitMapping.length; i < numMappings; i++){
        if (digitMapping[i].digit == digit){
            retVal = digitMapping[i].mapping[digits.length - 1];
            break;
        }
    }

    return retVal;
}

最佳答案

首先,在函数外部声明您的数字映射,这样您就可以重复使用该工作的结果,而不是在每次调用该函数时都执行该工作。

其次,让 digitMapping 使用键/值对,这样您就可以根据给定的属性名称进行快速查找,而不必遍历它。

var digitMapping = 
{
    "1": [],
    "2": ["a", "b", "c"],
    ...
};

function getLetterFromDigits(digits){
    var digit = digits.substring(0, 1);
    return digitMapping[digit][digits.length - 1];
}

关于javascript - 提高 JavaScript 函数的性能(使用数组查找),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37729998/

相关文章:

c++ - 是否有将 2D C++ 数组转换为对的好方法?

php - 将内容存储在数据库而不是普通的 ASPX 或 PHP 页面上是否存在性能问题?

javascript - 使用 React 渲染时如何访问现有的 dom 元素?

javascript - 使用属性对标签进行排序

Javascript 使用数字编码?

c# - SQL Server : Event does not reference any tables (Tuning Advisor warning)

performance - 唯一记录的总和 - 比游标更好的性能

javascript - node.js 的哪个 ORM?

c - 从当前目录获取文件名,保存到 char ** array, glob, C, seg fault

arrays - 检查哪个日期最接近今天