2014-11-06 43 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 }