将字符串与许多模式之一匹配并提取数据

Matching a string to one of many patterns and extracting data

我有一个问题想用 RegEx 或任何其他方法解决,如果有更好的方法的话。我尝试了几种方法来实现目标,但没有任何效果。

我有一个端点数组:

const endpoints = [
    {
        id: 1,
        url: "/api/items/:itemId"
    },
    {
        id: 2,
        url: "/api/users/:userName/delete"
    },
    {
        id: 3,
        url: "/api/users/:userName/edit"
    }
];

还有一个请求URL:

const url = "/api/users/max/edit";

现在我想要的是具有如下功能:

const rewrite = (url, endpoints) => {

    // What is the best way to achieve the following return value:

    return {
        endpointId: 3,
        values: {
            userName: "max"
        }
    };
};

说明:该函数应该为 url 找到合适的端点。以冒号开头的端点 url 的所有部分都不是静态的,而是应该替换为请求 url 中的值。在这种情况下,:userName 应替换为 max

我从事网络开发已经有一段时间了,但老实说,我几乎不知道如何解决这样的问题。

您可以通过 endpoints 将每个 .url 变成正则表达式来测试 url。

找到匹配项后,只需提取所需部分并使用 属性 名称组成一个对象即可:

<script>
    const myEndpoints = [
        {
            id: 1,
            url: "/api/items/:itemId"
        },
        {
            id: 2,
            url: "/api/users/:userName/delete"
        },
        {
            id: 3,
            url: "/api/users/:userName/edit"
        }
    ];

    const myUrl = "/api/users/nermal/edit";

    const rewrite = (url, endpoints) => {

        for (let i = 0; i < endpoints.length; i++) {
            var rep = new RegExp(":(\w+)", "m");
            var propName = rep.exec(endpoints[i].url);

            var reu = new RegExp(endpoints[i].url.replace(propName[0], "(.*)"));
            var a = reu.exec(url);

            if (a !== null) {
                var x = new Object;
                x["endpointId"] = endpoints[i].id;
                var y = new Object;
                y[propName[1]] = a[1];
                x["values"] = y;
                return x;
            }

        }

        return null;
    };

    var q = rewrite(myUrl, myEndpoints);
    console.log(q);
    console.log(q.values);

</script>

输出:

Object { endpointId: 3, values: {…} }
Object { userName: "nermal" }

const rewrite = (url, endpoints) => {
    var doubledArray = Array.prototype.map.call(endpoints, function(el) {
        return {
            id: el.id,
            url: el.url.split('/')
        };
    });

    var parts = url.split('/');
    var i = 0;
    parts.forEach(function(element) {
        doubledArray = doubledArray.filter(el => (element == el.url[i] || el.url[i].startsWith(':')));
        i++;
    });

    return {
        endpointId: doubledArray[0].id,
        values: {
            [`${doubledArray[0].url.filter(el => el.startsWith(':'))[0].substring(1)}`]: parts[doubledArray[0].url.findIndex(function (el) { return el.startsWith(':'); } )],
        }
    };

};