下划线_.findWhere包含反斜杠

时间:2014-03-06 19:46:15

标签: javascript underscore.js

我正在尝试使用_.findWhere来定位包含反斜杠的节点(它们表示api中的“子文件夹”)。但是我在搜索单个反斜杠时遇到问题,而且我不确定这是否只是其中一种语言不容易实现的问题。 我的函数调用目前看起来像这样:

        for(var i in data){
            if(
                _.findWhere(data, {name:'\\'})
            ) {
                console.log(data[i]);
                console.log('this');
            };
        }

以及数据的一个例子:

[
    {
        "name": "QA",
        "matchedElements": [
            {
                "id": 285,
                "name": " exch2010"
            },
            {
                "id": 288,
                "name": "ad01"
            },
            {
                "id": 289,
                "name": "exchange01"
            },
            {
                "id": 290,
                "name": "ad02"
            }
        ]
    },
    {
        "name": "QA\\Stuff",
        "matchedElements": [
            {
                "id": 240,
                "name": "build-vmstudio-26"
            },
            {
                "id": 241,
                "name": "build-seleniumw"
            },
            {
                "id": 242,
                "name": "build-linux-02"
            },
            {
                "id": 250,
                "name": "build-rh5-x64"
            },
            {
                "id": 251,
                "name": "build-rh5-x86"
            },
            {
                "id": 563,
                "name": "build-linux-01"
            }
        ]
    },
    {
        "name": "PROD",
        "matchedElements": [
            {
                "id": 7,
                "name": "css-ora11sql2k8.uptimesoftware.com"
            },
            {
                "id": 8,
                "name": "css-sql2005.uptimesoftware.com"
            }
        ]
    }
]

最终,脚本将使用带有双反斜杠的节点,将其与同名节点匹配,并将其作为子节点放置以创建嵌套对象。

1 个答案:

答案 0 :(得分:2)

findWhere正在寻找完全匹配 - 但您的数据都不会仅使用反斜杠命名。相反,您可以使用find来获取具有该名称的第一个元素。但是,您实际需要的功能是_.some

for (var i=0; i<data.length; i++){
    if( _.some(data[i].matchedElements, function(element) {
            return /\\/.test(element.name);
    }) ) {
        console.log(data[i]);
    }
}

另外,do not use for in loops on arrays


实际上,你似乎根本不需要那个循环。如果您希望下划线在data中找到.name包含反斜杠的元素,请使用

var elements = _.filter(data, function(element) {
    return /\\/.test(element.name);
});
_.each(elements, function(el) {
    console.log(el);
});

或等效 - 完全没有下划线 - 你已经拥有的循环结构:

for (var i=0; i<data.length; i++){
    if( /\\/.test(data[i].name) ) {
        console.log(data[i]);
    }
}

而不是/\\/.test(x)您也可以使用x.indexOf("\\")!=-1