如何在javascript中过滤对象

时间:2012-11-22 20:33:35

标签: javascript jquery object

我在javascript中工作并坚持理解对象。 这是我的情景。

我有一个对象,其中包含多个对象,如。

data {
"aa" : object
"bb" : object
"cc" : object
}

//expanding aa bb and cc

aa {
name : "a"
type : "static"
value : "123"
}

bb {
name : "b"
type : "dyn"
value : "343"
}

cc {
name : "c"
type : "dyn"
value : "545"
}

现在我想要实现的是我有一个对象应该有那些具有type =“dyn”的对象 所以我想要一个像这样的reqdata对象

reqdata {
"bb" : object
"cc" : object
}

我编写了一个代码来执行此操作,但由于我的reqdata包含所有数据,因此无法正常工作。

   var reqData = $.each (data, function(key, d){
        if (type === "dyn")
            return d;                             
        });

任何人都可以指导我通过对象循环的正确和有效方法。

感谢任何帮助和指导,我们将不胜感激

3 个答案:

答案 0 :(得分:1)

如果type符合您的要求,您需要创建一个新对象,测试type属性,并将当前子对象分配给新对象。

          // v--- Holds the results
var newObj = {};
                       //   v--- The current sub-object
$.each(data, function(key, obj){
    if (obj.type === "dyn") // <-- Test its `type` property
        newObj[key] = obj;  // <--   and assign to `newObj` if it matches
});

您应该注意,在将obj分配给newObj时,您并未复制obj。您正在复制data的引用。

这意味着newObjdata共享相同的对象。通过newObj进行的更改可以从{{1}}观察到,反之亦然。

答案 1 :(得分:0)

如果您习惯于函数式编程,可以为对象编写自己的过滤函数:

function oFilter (obj, f) {
    var result = {};
    for (var x in obj) {
        if (
            obj.hasOwnProperty(x) &&
            f(x,obj[x])
        ) {
            result[x] = obj[x];
        }
    }
    return result;
}

那就像你期望的那样:

var reqData = oFilter(data, function(key,d){
    if (d.type === "dyn") return true;
    return false;
});

同样适用于地图:

function oMap (obj, f) {
    var result = {};
    for (var x in obj) {
        if (obj.hasOwnProperty(x)) {
            result[x] = f(x,obj[x]);
        }
    }
    return result;
}

虽然减少对物体没有意义。

答案 2 :(得分:0)

短。

$(data).each( function(){
    if(this.type === 'dyn'){ doStuff(this); }
} );

现在,IMO,构造函数名称更接近于JS中的类型。我将使用函数构造函数名称'Dyn'构建这些对象,并检查<instance>.constructor.name是否为'Dyn'但是你必须对IE&lt; = 8进行规范化,这涉及解析<instance>constructor.toString()所以可能比它更麻烦值得。

但是如果你想了解JS对象。抛弃jQuery直到你这样做。了解如何使用:

for(var x in object){
    console.log('propertyLabel:' +x+', property:' + object[x]+'\n');
}

然后回过头来了解jQuery本身是如何工作的。引擎盖下有很多多汁的东西。