2014-11-06 49 views
0

是否有办法将for ... in循环中的所有内容过滤掉以仅获取对象?For ...在环路中仅筛选对象

我正在写一个函数来循环嵌套对象来查找某些数据片段,然后将其保存到localStorage。

实施例:

var equipped = { 
    data: [the rest of the properties of equipped go here], 
    tool: { 
     data: [the rest of the properties of tool go here], 
     axe: { 
      data: [the rest of the properties of axe go here], 
      iron: {...}, 
      steel: {...} 
     } 
    } 
} 

的工具/ AX /金属属性都动态地生成的,并且每个时间是不同的。金属属性内部是我试图保存的数据。如果我试图访问数据,我通常会循环访问数据(使用knockoutjs进行绑定,仅仅对foreach数据数组更容易),但是我使用for ... in循环中的变量来构建在对其进行字符串化之前,我的localStorage对象中的其余部分树。

我如何阅读对象:

for (var type in equipped) { 
    if (check goes here) { 
     savedValue.equipped[type] = {}; 
     for (var category in equipped[type]) { 
      etc etc... 
     } 
    } 
} 

我明白一切都是对象类型,所以我不能只是做一个instanceoftypeof定义的对象将它们过滤出来。是否有另一种简单的方法在if语句中执行它,还是必须从构造函数中完成树的每一步,因此我可以instanceof RealObject

+0

并非一切都将复出为“对象”时调用'typeof运算'。请参阅:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof – User 2014-11-06 05:56:34

+0

不,但数组会。我只需要做一个if(typeof type ==='object'&&!Array.isArray(type))来解决这个问题? – LastElf 2014-11-06 06:11:51

回答

0

这些要么应该做的很好:

function isObject(val) { 
    if (val === null) { return false;} 
    return (typeof val === 'object'); 
} 

function isObject(obj) { 
    return obj === Object(obj); 
} 

或 //这仅适用于对象文本

function isObject(val) { 
    return (!!val) && (val.constructor === Object); 
}; 

这最后一个,给我的如下:

console.log(isObject()); // false 
console.log(isObject([])); // false 
console.log(isObject(new Date)); // false 
console.log(isObject({})); // true 
console.log(isObject(null)); // false 
console.log(isObject(true)); // false 
console.log(isObject(1)); // false 
console.log(isObject('someValueString')); // false 

这样,是这样的:

for (var type in equipped) { 
    if (isObject(type)) { 
     savedValue.equipped[type] = {}; 
     for (var category in equipped[type]) { 
      etc etc... 
     } 
    } 
} 

注意:您还可以尝试以下方法,但我没有用它。所以你必须通过你的用例。

Object.getPrototypeOf 
+0

我刚刚尝试了这两个函数,并且它们都返回了数据数组的真实值。我只想得到直接定义的对象的属性(无论是否由构造函数,无关紧要,只要它不是数组/函数)。 – LastElf 2014-11-06 06:09:59

+0

好吧,所以 - 只是散列或关联的数组。我得到你,保持一秒钟。试试最后一个。 – 2014-11-06 06:11:02

+0

谢谢,最后一个工作很好。你能解释一下(!! val)是什么吗?这个对象的工作也是使用自定义构造函数创建的,而不是逐字定义的? – LastElf 2014-11-06 06:15:43

0

这里有一个我以前用过的类型检测的旧破解。

var classChecker = {}.toString; 
classChecker.call({}); 
classChecker.call(function() {}); 
classChecker.call([]); 
// etc... 

// More immediately relevant use: 
var savedValue = { 
    equipped: {} 
}; 
var objectString = classChecker.call({}); 

for (var type in equipped) { 
    if (classChecker.call(equipped[type]) === objectString) { 
    savedValue.equipped[type] = {}; 
    for (var category in equipped[type]) { 
     // ... 
    } 
    } 
} 

console.log(savedValue); 

请参阅http://plnkr.co/edit/nKLQsOdcurrpUCg7cOoJ?p=preview的工作示例。 (打开你的控制台查看输出)

0

下面是代码检查变量是否是对象或不:

function isJsonObject(obj) {   
 
\t \t // Must be an Object. 
 
\t \t // Because of IE, we also have to check the presence of the constructor property. 
 
\t \t // Make sure that DOM nodes and window objects don't pass through, as well 
 
\t \t if (!obj || obj.toString() !== "[object Object]" || obj.nodeType || obj.setInterval) { 
 
\t \t \t return false; 
 
\t \t } 
 

 
\t \t // Not own constructor property must be Object 
 
\t \t if (obj.constructor 
 
\t \t \t && !obj.hasOwnProperty("constructor") 
 
\t \t \t && !obj.constructor.prototype.hasOwnProperty("isPrototypeOf")) { 
 
\t \t \t return false; 
 
\t \t } 
 

 
\t \t // Own properties are enumerated firstly, so to speed up, 
 
\t \t // if last one is own, then all properties are own. 
 

 
\t \t var key; 
 
\t \t for (key in obj) {} 
 

 
\t \t return key === undefined || obj.hasOwnProperty(key); 
 
\t }