我正在尝试使用_.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"
}
]
}
]
最终,脚本将使用带有双反斜杠的节点,将其与同名节点匹配,并将其作为子节点放置以创建嵌套对象。
答案 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
。