javascript - 字符串操作以查找字符串中的变量

标签 javascript string

我正在使用 JS,并且有一个问题,我有两个字符串,例如:

var test = "This is a {feature1} and {feature2} boy.";
var data = "This is a very good and smart boy.";

考虑到 {} 中包含的任何单词都是变量,替换变量的适当值会将 test 转换为 data

问题的陈述是,如果问题有解决方案,我们需要找到每个单词的值,否则,从方法中返回 false。

因此,在上面的示例中,我们的返回值为

{
    feature1: 'very good',
    feature2: 'smart'
}

到目前为止,我已经尝试了下面的代码,它似乎可以工作,但对于这个操作来说似乎有点复杂。

function matchAndGetVar(test, data) {
    function multiSplit(data, splitters) {
        function helper(dataArray, splitter) {
            return dataArray.reduce((acc, curr) => {
                acc.push(...curr.split(splitter));
                return acc;
            }, []);
        }
    
        return splitters.reduce((acc, curr) => helper(acc, curr), [data]).map((f, index) => {
            if (index % 2 === 0) return f;
            return '{' + f + '}';
        });
    }

    var splittedTestData = multiSplit(test, ['{', '}']);
    
    return splittedTestData.reduce((acc, curr, index) => {
        if (curr.startsWith("{") && curr.endsWith("}")) {}
        else if (index === 0) {
            if (data.startsWith(curr)) {
                data = data.substr(curr.length);
            } else {
                return false;
            }
        } else if (splittedTestData[index] === "") {
            if (acc)
                acc[splittedTestData[index - 1].substr(1, splittedTestData[index - 1].length - 2)] = data;
            data = "";
        } else {
            const index1 = data.indexOf(splittedTestData[index]);
            if (index1 === -1) return false;
            if (acc)
                acc[splittedTestData[index - 1].substr(1, splittedTestData[index - 1].length - 2)] = data.substr(0, index1);
            data = data.substr(index1 + splittedTestData[index].length);
        }
        return acc;
    }, {});
}

var test = "This is a {feature1} and {feature2} boy.";
var data = "This is a very good and smart boy.";

console.log(matchAndGetVar(test, data));

任何人都可以建议一些更简单的方法或对实现进行任何修改吗?

最佳答案

您可以使用正则表达式,有一个示例

var test = "This is a {feature1} and {feature2} boy.";
var data = "This is a very good and smart boy.";

let resp = findFeatures(test);
console.log(resp)
function findFeatures(data) {

    let features = {};

    /* EXTRACTING FEATURE KEYS */
    data.match(/\{(.+?)\}/g).forEach(result => {
        features[result.slice(1, -1)] = ""
    })

    let matches = matchWithData(test);
    if (Object.keys(features).length > 0 && matches.length == Object.keys(features).length) { // if pattern results matches with data
        Object.keys(features).forEach((feature, index) => {
            features[feature] = matches[index]
        })
    }
    return features;
}

function matchWithData(test) {

    let regex = test.replace(/\{.+?\}/g, "(.*)");

    if (new RegExp(regex).test(data)) // data matches with test
        return data.match(new RegExp(regex)).slice(1); // get features
    return [];
}

关于javascript - 字符串操作以查找字符串中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59633387/

相关文章:

javascript - 如何从数组的数组中选择

javascript - 动态添加文件到 Chrome 扩展程序?

javascript - jQuery。循环中从ajax获取var

java - 用于从字符串获取电话号码掩码的正则表达式

python - 如何使用部分匹配查找子字符串

string - 在 .htaccess 中重写查询字符串

ruby - Ruby 中的 substr 是什么?

c - 如何找到指针数组指向的元素的大小?

javascript - 当有一张幻灯片时,Swiper js 显示 3 张相同的幻灯片

javascript - 单击以切换以获得更好的性能方法