对于...循环过滤仅对象

时间:2014-11-06 05:43:54

标签: javascript

有没有办法过滤掉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...
        }
    }
}

我知道所有内容都是对象类型,所以我不能只对已定义的对象执行instanceoftypeof来过滤它们。是否有另一种简单的方法可以在if语句中执行此操作,还是必须从构造函数中创建树的每一步,以便我可以instanceof RealObject

3 个答案:

答案 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 );
	}