我在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;
});
任何人都可以指导我通过对象循环的正确和有效方法。
感谢任何帮助和指导,我们将不胜感激
答案 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
的引用。
这意味着newObj
和data
共享相同的对象。通过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本身是如何工作的。引擎盖下有很多多汁的东西。