0

我在 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"
}

现在我想要实现的是我有一个对象,它应该有那些类型为“dyn”的对象,所以我想要一个像这样的 reqdata 对象

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

我已经编写了一个代码来执行此操作,但它无法正常工作,因为我的 reqdata 拥有所有数据。

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

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

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

4

3 回答 3

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

这意味着datanewObj共享相同的对象。通过 所做的更改data可以从 观察到newObj,反之亦然。

于 2012-11-22T20:39:51.720 回答
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;
}

不过,Reduce 对对象没有意义。

于 2012-11-22T20:54:28.690 回答
0

更短。

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

现在,IMO,构造函数名称更接近于 JS 中的类型。我将使用函数构造函数名称“Dyn”构建这些对象并检查<instance>.constructor.name“Dyn”,但您必须针对 IE<=8 进行规范化,这涉及解析<instance>constructor.toString(),因此可能比它的价值更麻烦。

But if you want to understand JS objects. Ditch the jQuery until you do. Learn how to use:

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

Then go back to understanding how jQuery itself works. Lots of juicy stuff under the hood there.

于 2012-11-22T20:54:47.017 回答