Underscore.js : 匹配深层嵌套对象中的字符串
Underscore.js : matching string in deeply nested objects
我需要找出这个深层嵌套数组中的哪个对象包含字符串 Toys & Games
(嵌套中最深的对象)。
我正在尝试 select 正确的对象:
var arr = _.filter(data, function(obj) {
return _.some(obj.Ancestors, {'Name': "Toys & Games"});
});
传递给 .filter
的 data
是:
{
"BrowseNodeId":[
"11608080011"
],
"Name":[
"Quadcopters & Multirotors"
],
"Ancestors":[
{
"BrowseNode":[
{
"BrowseNodeId":[
"166583011"
],
"Name":[
"RC Vehicles"
],
"Ancestors":[
{
"BrowseNode":[
{
"BrowseNodeId":[
"6925830011"
],
"Name":[
"RC Vehicles & Parts"
],
"Ancestors":[
{
"BrowseNode":[
{
"BrowseNodeId":[
"276729011"
],
"Name":[
"Hobbies"
],
"Ancestors":[
{
"BrowseNode":[
{
"BrowseNodeId":[
"165795011"
],
"Name":[
"Categories"
],
"IsCategoryRoot":[
"1"
],
"Ancestors":[
{
"BrowseNode":[
{
"BrowseNodeId":[
"165793011"
],
"Name":[
"Toys & Games"
]
}
]
}
]
}
]
}
]
}
]
}
]
}
]
}
]
}
]
}
]
},
{
"BrowseNodeId":[
"3226142011"
],
"Name":[
"Grown-Up Toys"
],
"Children":[
{
"BrowseNode":[
{
"BrowseNodeId":[
"3226143011"
],
"Name":[
"Action & Toy Figures"
]
},
{
"BrowseNodeId":[
"3226145011"
],
"Name":[
"Die-Cast & Toy Vehicles"
]
},
{
"BrowseNodeId":[
"3226146011"
],
"Name":[
"Games"
]
},
{
"BrowseNodeId":[
"3226148011"
],
"Name":[
"Novelty & Gag Toys"
]
},
{
"BrowseNodeId":[
"3226149011"
],
"Name":[
"Puzzles"
]
},
{
"BrowseNodeId":[
"5483953011"
],
"Name":[
"Executive Desk Toys"
]
}
]
}
],
"Ancestors":[
{
"BrowseNode":[
{
"BrowseNodeId":[
"165795011"
],
"Name":[
"Categories"
],
"IsCategoryRoot":[
"1"
],
"Ancestors":[
{
"BrowseNode":[
{
"BrowseNodeId":[
"165793011"
],
"Name":[
"Toys & Games"
]
}
]
}
]
}
]
}
]
}
我最终没有使用 Underscore,而是使用了异步 while
循环:
function traverseNodes(nodeList,findMe,callbackMM){
var nodeArr = []; //collect all browse nodes
async.eachSeries(nodeList, function(item, callbackZ) {
var currentNode = item;
var childNodeId = currentNode.BrowseNodeId[0]; //get first ID in nest tree
async.whilst(
function () {
if (currentNode.Name && currentNode.Name[0] == findMe){ //we found the string, stop traversing
nodeArr.push(childNodeId);
return false;
}else if (currentNode.Ancestors){ //didn't find string, keep traversing
currentNode = currentNode.Ancestors[0].BrowseNode[0];
return true;
}
else {
return false;
}
},
function (callback) {
callback();
},
function (err) {
if (err){
console.log('WHILST error in search.js ',err);
}
callbackZ();
}
);
}, function done(){
if (nodeArr.length > 0){
callbackMM(nodeArr.toString());
}
else {
console.log('error: no browseNodes found')
}
});
}
我需要找出这个深层嵌套数组中的哪个对象包含字符串 Toys & Games
(嵌套中最深的对象)。
我正在尝试 select 正确的对象:
var arr = _.filter(data, function(obj) {
return _.some(obj.Ancestors, {'Name': "Toys & Games"});
});
传递给 .filter
的 data
是:
{
"BrowseNodeId":[
"11608080011"
],
"Name":[
"Quadcopters & Multirotors"
],
"Ancestors":[
{
"BrowseNode":[
{
"BrowseNodeId":[
"166583011"
],
"Name":[
"RC Vehicles"
],
"Ancestors":[
{
"BrowseNode":[
{
"BrowseNodeId":[
"6925830011"
],
"Name":[
"RC Vehicles & Parts"
],
"Ancestors":[
{
"BrowseNode":[
{
"BrowseNodeId":[
"276729011"
],
"Name":[
"Hobbies"
],
"Ancestors":[
{
"BrowseNode":[
{
"BrowseNodeId":[
"165795011"
],
"Name":[
"Categories"
],
"IsCategoryRoot":[
"1"
],
"Ancestors":[
{
"BrowseNode":[
{
"BrowseNodeId":[
"165793011"
],
"Name":[
"Toys & Games"
]
}
]
}
]
}
]
}
]
}
]
}
]
}
]
}
]
}
]
}
]
},
{
"BrowseNodeId":[
"3226142011"
],
"Name":[
"Grown-Up Toys"
],
"Children":[
{
"BrowseNode":[
{
"BrowseNodeId":[
"3226143011"
],
"Name":[
"Action & Toy Figures"
]
},
{
"BrowseNodeId":[
"3226145011"
],
"Name":[
"Die-Cast & Toy Vehicles"
]
},
{
"BrowseNodeId":[
"3226146011"
],
"Name":[
"Games"
]
},
{
"BrowseNodeId":[
"3226148011"
],
"Name":[
"Novelty & Gag Toys"
]
},
{
"BrowseNodeId":[
"3226149011"
],
"Name":[
"Puzzles"
]
},
{
"BrowseNodeId":[
"5483953011"
],
"Name":[
"Executive Desk Toys"
]
}
]
}
],
"Ancestors":[
{
"BrowseNode":[
{
"BrowseNodeId":[
"165795011"
],
"Name":[
"Categories"
],
"IsCategoryRoot":[
"1"
],
"Ancestors":[
{
"BrowseNode":[
{
"BrowseNodeId":[
"165793011"
],
"Name":[
"Toys & Games"
]
}
]
}
]
}
]
}
]
}
我最终没有使用 Underscore,而是使用了异步 while
循环:
function traverseNodes(nodeList,findMe,callbackMM){
var nodeArr = []; //collect all browse nodes
async.eachSeries(nodeList, function(item, callbackZ) {
var currentNode = item;
var childNodeId = currentNode.BrowseNodeId[0]; //get first ID in nest tree
async.whilst(
function () {
if (currentNode.Name && currentNode.Name[0] == findMe){ //we found the string, stop traversing
nodeArr.push(childNodeId);
return false;
}else if (currentNode.Ancestors){ //didn't find string, keep traversing
currentNode = currentNode.Ancestors[0].BrowseNode[0];
return true;
}
else {
return false;
}
},
function (callback) {
callback();
},
function (err) {
if (err){
console.log('WHILST error in search.js ',err);
}
callbackZ();
}
);
}, function done(){
if (nodeArr.length > 0){
callbackMM(nodeArr.toString());
}
else {
console.log('error: no browseNodes found')
}
});
}