我有一个如下所示的对象:
parentObj:{
nodes: [
{
nodeId : 'AAA',
nodeType : 'bottom'
},
{
nodeId : 'BBB',
nodeType : 'top'
},
{
nodeId : 'CCC',
nodeType : 'bottom'
},
{
nodeId : 'DDD',
nodeType : 'top'
},
{
nodeId : 'EEE',
nodeType : 'bottom'
},
{
nodeId : 'FFF',
nodeType : 'middle'
},
{
nodeId : 'GGG',
nodeType : 'middle'
},
{
nodeId : 'HHH',
nodeType : 'bottom'
},
{
nodeId : 'III',
nodeType : 'middle'
}
],
owners: {
'Johnson' : [ 'AAA', 'BBB', 'DDD', 'III' ], /* node ids to indicate Johnson owns these nodes */
'Smith' : [ 'XXX', 'GGG', 'EEE', 'FFF' ] /* node ids to indicate Smith owns these nodes */
}
}
我想要做的是编写一个传递所有者名称和节点类型的函数,该函数将输出属于该所有者的节点数组,并且还匹配指定的节点类型。
例如,
var getNodes = function('Johnson', 'top'){
var ret;
/* some logic I've yet to understand... */
return ret;
}
/* ret would look like this */
ret = [
{
nodeId : 'BBB',
nodeType : 'top'
},
{
nodeId : 'DDD',
nodeType : 'top'
}
]
因此,只有属于Johnson
且类型为top
的节点才会填充我的数组。
如果可能的话,我最好是使用下划线来实现这个目标吗?
有人会有任何建议或意见吗?
答案 0 :(得分:1)
试试这个
var name = "Johnson";
var type = "top";
var getNodes = function( name, type ){
var ret = [];
var nodes = parentObj.owners[name];
for ( var counter = 0; counter < parentObj.nodes.length; counter++ )
{
if ( nodes.indexOf( parentObj.nodes[ counter ].nodeId ) != -1 && parentObj.nodes[ counter ].nodeType == type )
{
ret.push( parentObj.nodes[ counter ] );
}
}
return ret;
};
console.log(getNodes( name, type ));
答案 1 :(得分:1)
使用_.filter方法可以使用下划线 你可以做点什么
var ret=_.filter(parentObj,function(val){return val.nodeType=="top"})
答案 2 :(得分:1)
使用reduce
按所有者和filter
构建自有项目缓存,以实际过滤节点列表。
function getNodes(owner, type) {
var belongsToOwner = data.owners[owner].reduce(function(acc, name){
return acc[name] = 1, acc;
});
return data.nodes.filter(function(node) {
return node.nodeType === type && belongsToOwner[node.nodeId]
});
}
答案 3 :(得分:1)
应该有效:
var getNodes = function(owner, position){
var ret=[];
var nodes = parentOb.owners[owner];
_.each(nodes, function(node){
ret = ret.concat(_.findWhere(parentObj.nodes, {"nodeId": node.nodeId, "nodeType": position}));
})
return ret;
};
答案 4 :(得分:1)
我认为使用过滤器可以解决您的问题。
var getNodes = function(name, type){
var ret = _.filter(parentObj.nodes, function(node) {
return node.nodeType === type && _.contains(parentObj.owners[name], node.nodeId
}
return _.uniq(ret);
}
答案 5 :(得分:1)
此提议迭代对象,返回一个包含所需结果的数组。
function getNodes(owner, nodeType) {
return data.parentObj.nodes.filter(function (a) {
return a.nodeType === nodeType && ~data.parentObj.owners[owner].indexOf(a.nodeId);
});
}
var data = { parentObj: { nodes: [{ nodeId: 'AAA', nodeType: 'bottom' }, { nodeId: 'BBB', nodeType: 'top' }, { nodeId: 'CCC', nodeType: 'bottom' }, { nodeId: 'DDD', nodeType: 'top' }, { nodeId: 'EEE', nodeType: 'bottom' }, { nodeId: 'FFF', nodeType: 'middle' }, { nodeId: 'GGG', nodeType: 'middle' }, { nodeId: 'HHH', nodeType: 'bottom' }, { nodeId: 'III', nodeType: 'middle' }], owners: { 'Johnson': ['AAA', 'BBB', 'DDD', 'III'], 'Smith': ['XXX', 'GGG', 'EEE', 'FFF'] } } },
result = getNodes('Johnson', 'top');
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
&#13;
答案 6 :(得分:1)
function getNodes(ownerName, nodeType){
return _.chain(parentObj.nodes)
.filter(function(d){
return _.contains(parentObj['owners'][ownerName], d.nodeId);
})
.where({'nodeType': nodeType})
.value();
}