2016-12-05 48 views
1

我正在迭代一個對象數組使用for循環我得到它裏面的所有對象,但我也得到一個函數,我想知道我是如何得到這個。 我迭代的代碼如下所示:爲什麼我得到函數,同時在node.js中循環迭代

for (var key in student) { 
     console.log(student[key]); 
} 

我與對象相處是

function (value) { 
    if (this.indexOf(value) !== -1) { 
     this.splice(this.indexOf(value), 1); 
     return true; 
    } else { 
     return false; 
    } 
} 

這是在拋出錯誤產生的問題,即使我只使用

console.log(student[key].length); 

任何意見高度讚賞。

+0

如何'student'產生的? –

+3

在數組中使用'for..in'的不良做法。你應該使用'forEach' – Rajesh

+1

另外,你可以直接使用'array.filter(x => x!== value)' – Rajesh

回答

1

因爲for-in循環訪問所有對象及其原型的枚舉屬性,包括那些引用函數的屬性。顯然,有人已經將一個枚舉屬性添加到指向函數的student數組(或Array.prototype)。

如果你想讓它不露面,通過Object.defineProperty使屬性不可枚舉,或者如果它是在對象的原型鏈,但不是對象本身,你只需要對象的「自己」的屬性,添加一個hasOwnProperty檢查(或使用Object.keys獲取一組屬性名稱)。

但是,如果student確實是數組,for-in通常是循環其條目的錯誤工具;有關詳細信息,請參閱For-each over an array in JavaScript?的答案。


在評論你問:

當我使用嵌套的forEach循環就建議我不要使用函數內循環在這種情況下,先生怎麼辦?

該警告並非總是重要,有時(甚至經常)您可以忽略它。但是如果你想避免在循環中創建函數,只需將該函數移出循環即可。例如,你可以把這個:

function foo() { 
    outer.forEach(function(outerEntry) { 
     outerEntry.forEach(function(innerEntry) { 
      // Use `innerEntry` here... 
     }); 
    }); 
} 

function foo() { 
    outer.forEach(handleOuter); 

    function handleOuter(outerEntry) { 
     outerEntry.forEach(handleInner); 
    } 

    function handleInner(innerEntry) { 
     // Use `innerEntry` here... 
    } 
} 
+0

你是偉大的先生。 – jsgeek

+0

當我使用嵌套的forEach循環它建議我不使用函數內循環在那種情況下做什麼先生? – jsgeek

+0

@kisor:我在 –

相關問題