【问题标题】:How to search a key/value pair with a regex in JavaScript?如何在 JavaScript 中使用正则表达式搜索键/值对?
【发布时间】:2017-02-16 05:16:06
【问题描述】:

我有一个包含键/值对的 JavaScript 对象,我想用正则表达式搜索一个。这是一个例子:

var map = {
    'my/route/one': 'Title1',
    'my/route/two': 'Title2',
    '/': 'Home'
}

我想要这样的东西:

var myValue = searchByKey(map, 'my/route/two');

我一开始是这样做的:

searchByKey: function (map, routePattern) {
    var foundTitle,
        route;
    for (route in map) {
        if (routePattern.match(route)) {
            foundTitle = map[route];
            break;
        }
    }
    return foundTitle;
}

成功了,太好了。然后,我想有一些更实用的东西,所以我想到了这个:

function searchByKey(map, routePattern) {
    var foundTitle;
    Object.keys(map).forEach(function(key) {
        if (routePattern.match(key)) {
            foundTitle = map[key];
        }
    });
    return foundTitle;
}

但它可能会匹配其他键,例如最后一个 '/'

您知道如何以优雅的方式实现这一目标吗?

谢谢!

【问题讨论】:

  • 为什么不用indexOf 而不是match
  • 这是因为与for 循环不同,您不能从forEach 循环中中断,您可以使用find 而不是forEach。例如:return Object.keys(map).find(function(key) { return routePattern.match(key); });

标签: javascript regex dictionary key match


【解决方案1】:

为什么不直接使用密钥呢?

function searchByKey(object, key) {
    return object[key];
}

var map = {
    'my/route/one': 'Title1',
    'my/route/two': 'Title2',
    '/': 'Home'
}

var myValue = searchByKey(map, 'my/route/two');
console.log(myValue);

使用拆分键的另一次尝试

function searchByKey(object, key) {
    var items = key.split('/');
    return Object.keys(object).filter(function(k) {
        return items.every("".match.bind(k));
    });
}

var map = {
        'my/route/one': 'Title1',
        'my/route/two': 'Title2',
        '/': 'Home'
    },
    myKeys = searchByKey(map, 'my/route/two');

console.log(myKeys);

【讨论】:

  • 因为我必须存储我的所有路线,包括带参数的路线。例如,标题为“我的个人资料”的页面可以显示具有不同路线的多个视图,例如“个人资料/信息”、“个人资料/密码”等。为了不必存储所有路线,我想能够使用匹配。
  • 好的,这很有意义。但你的例子有点误导。也许你会添加一些(更多)深入的例子来搜索什么以及你想得到什么。
【解决方案2】:

你可以简单地做到这一点!

function searchByKey(map, route) {
  return map[route] ? map[route] : 'not found' //return 'not found' when an invalid key is given
}

var map = {
    'my/route/one': 'Title1',
    'my/route/two': 'Title2',
    '/': 'Home'
}

var myValue = searchByKey(map, 'my/route/two')
console.log(myValue)

【讨论】:

  • 防止返回虚假值。
  • 否则返回undefined
猜你喜欢
  • 1970-01-01
  • 2015-08-31
  • 2012-08-13
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多