使用javascript对象填充数组。通过比较两个字符串值

时间:2016-03-01 13:33:09

标签: javascript arrays underscore.js

我有一个如下所示的对象:

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的节点才会填充我的数组。

如果可能的话,我最好是使用下划线来实现这个目标吗?

有人会有任何建议或意见吗?

7 个答案:

答案 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)

此提议迭代对象,返回一个包含所需结果的数组。

&#13;
&#13;
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;
&#13;
&#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();
}