从密钥与javascript和下划线匹配特定条件的对象返回键值对

时间:2013-12-20 01:41:38

标签: javascript map filter underscore.js

var obj = {
"M_18-24":413109,
"F_18-24":366159,
"F_25-34":265007,
"U_25-34":1214,
"U_35-44":732
} 

我想返回一个带有键值对的对象,其键以“M”或“F”开头。所以最终的对象看起来像

var obj = {
"M_18-24":413109,
"F_18-24":366159,
"F_25-34":265007
} 

我尝试过_.filter(obj,function(v,k){return /^[MF]/.test(k)})......

5 个答案:

答案 0 :(得分:2)

这样可以解决问题:

function filte_obj_FM (inp) 
{
    var ret = {};

    for ( var k in inp) 
    {
        if ( k[0] == "M" || k[0] == "F" ) 
        {
            ret[k] = inp[k];
        }
    }

    return ret;
}

在此处查看控制台输出(F12 + - >请参阅控制台):http://jsfiddle.net/vH3ym/2/

答案 1 :(得分:1)

你可以尝试

for (var prop in obj) { console.log(prop) }

它会为您提供相应的属性,然后您可以添加逻辑,如

if(prop.indexOf('M'))

答案 2 :(得分:1)

这应该有效:

var obj = {
    "M_18-24":413109,
    "F_18-24":366159,
    "F_25-34":265007,
    "U_25-34":1214,
    "U_35-44":732
} 
var filtered = {}
for(var key in obj) { 
  if(key[0] === "M" || key[0] === "F"){
    filtered[key] = obj[key]
  }
}

答案 3 :(得分:1)

这次使用 reduce

的另一个版本

//创建一个新的下划线函数,该函数将返回传递给定谓词的对象的属性

_.mixin({ filterProperties: function(obj, predicate){

    return  _.reduce(obj, function(memo, value, key){

        if( predicate(key) ){
            memo[key] = value;
        }

        return memo;

    }, {});
}});

//调用新函数时可以使用的几个谓词

function isMale(key){
    return key[0] == 'M';
}    

function isFemale(key){
    return key[0] == 'F';
}

//最后得到我们想要的数据:

var males = _.filterProperties( obj, isMale );
var females = _.filterProperties( obj, isFemale );

答案 4 :(得分:0)

这是我的解决方案:

_.filter(_.keys(obj), function(key) {
    return key.match(/U/);
}).forEach(function(kv) {
   delete obj[kv];
});

我认为你们所有人都很好,我把他们投了票。谢谢!