Javascript 对于…仅在循环中过滤对象

Javascript 对于…仅在循环中过滤对象,javascript,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: {

有没有一种方法可以过滤掉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语句中是否还有其他简单的方法来执行此操作,或者我是否必须从构造函数中执行树的每个步骤,以便可以实例化RealObject?

这两种方法都应该很好:

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

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

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

我以前使用过一种旧的类型检测方法

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);

有关工作示例,请参阅。打开控制台查看输出

以下是检查变量是否为object的代码:

函数isJsonObject对象{ //必须是一个对象。 //由于IE,我们还必须检查构造函数属性的存在。 //确保DOM节点和窗口对象也不会通过 if!obj | | obj.toString!==[对象对象]| | obj.nodeType | | obj.setInterval{ 返回false; } //Not own构造函数属性必须是对象 如果obj.constructor &&!obj.hasOwnPropertyconstructor &&!obj.constructor.prototype.hasOwnPropertyisPrototypeOf{ 返回false; } //首先枚举自己的属性,因此为了加快速度, //如果最后一个是自己的,那么所有属性都是自己的。 var键; 用于obj{}中的键 返回键===未定义的| | obj.hasOwnProperty键;
}调用typeof时,并非所有内容都将作为对象返回。请参阅:否,但数组将显示。我只需要做一个if typeof type==='object'&&!IsArray.isArraytype来解决这个问题吗?我刚刚尝试了这两个函数,它们对于数据数组也都返回true。我试图只获取直接定义的对象的属性,不管是否由构造函数定义,只要它不是数组/函数就行了。好的,所以-只要是散列或关联数组。我明白了,等一下。试试最后一个。谢谢,最后一个很好用。你能解释一下这是怎么回事吗!!瓦尔有吗?这对用自定义构造函数创建的对象有效吗?我刚才用自定义构造函数回答了我自己的问题。我仍然很好奇这个世界是怎样的!!val可以工作,就像是在布尔运算。用于将truthy值转换为布尔值true,falsy值转换为布尔值false。至少,我是这样想的。它还缩短了生成真/假的键入时间。另一个在IIFE上保存一两个字节的快捷方式,而不是函数{},do!函数{}
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);