有没有办法过滤掉for ... in循环中的所有内容,只能获取对象?
我正在编写一个循环遍历嵌套对象的函数来查找某些数据,然后将其保存到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: {...}
}
}
}
工具/轴/金属属性都是动态生成的,每次都不同。金属属性内部是我想要保存的数据。如果我试图访问数据,我通常会循环遍历数组(使用knockoutjs进行绑定,只是简单地预先处理数据数组),但我正在使用for ... in循环中的变量来构建字符串化之前,我的localStorage对象中的其余树。
我如何阅读对象:
for (var type in equipped) {
if (check goes here) {
savedValue.equipped[type] = {};
for (var category in equipped[type]) {
etc etc...
}
}
}
我知道所有内容都是对象类型,所以我不能只对已定义的对象执行instanceof
或typeof
来过滤它们。是否有另一种简单的方法可以在if语句中执行此操作,还是必须从构造函数中创建树的每一步,以便我可以instanceof RealObject
?
答案 0 :(得分: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
答案 1 :(得分: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。 (打开控制台查看输出)
答案 2 :(得分:0)
以下是检查变量是否为对象的代码:
function isJsonObject( obj ) {
// Must be an Object.
// Because of IE, we also have to check the presence of the constructor property.
// Make sure that DOM nodes and window objects don't pass through, as well
if ( !obj || obj.toString() !== "[object Object]" || obj.nodeType || obj.setInterval ) {
return false;
}
// Not own constructor property must be Object
if ( obj.constructor
&& !obj.hasOwnProperty("constructor")
&& !obj.constructor.prototype.hasOwnProperty("isPrototypeOf")) {
return false;
}
// Own properties are enumerated firstly, so to speed up,
// if last one is own, then all properties are own.
var key;
for ( key in obj ) {}
return key === undefined || obj.hasOwnProperty( key );
}