2013-08-21 139 views
0

我的作業是這樣的: 編寫一個「keys」函數,它傳遞一個對象並返回一個對象屬性的數組。一定要篩選出對象的方法。鍵數組只有對象的名稱/值對的名稱。由於跨瀏覽器問題(在舊瀏覽器中不支持),無法使用Objectkeys方法。您的功能應爲所有瀏覽器提供相同的服務。編寫一個函數,它傳遞一個對象並返回一個對象屬性的數組

我最初的代碼如下:

function keys(obj){ 
    var key=""; 
    var i = 0; 
    var array = []; 
    for(i = 1; i<arguments.length; i++){ 
    for(key in arguments[i]){ 
     if(obj.hasOwnProperty&&(!_.isArray(obj))){ 
      obj[key]=arguments[i][key]; 
     } 
    } 
    } 
    for(var j = 0; j < obj.length; j++){ 
    for(key in obj[j]){ 
     array[j] = obj[j]; 
    } 
    } 
return array; 
} 

我敢肯定,我的功能有很多的問題。你能幫我一下嗎?謝謝!

+0

你這段代碼注意哪些問題? –

+0

我不知道我自己。但我能感覺到我的代碼不是解決方案。 –

+0

我們可以給你解決方案,但那會是作弊,不是嗎?幫助我們通過解釋您嘗試的方法以及原因來幫助您。例如,所有這些循環是什麼?當你寫下他們時你有什麼想法? – bfavaretto

回答

1

這是解決方案:

function keys(obj) { 
    var hasOwnProperty = Object.prototype.hasOwnProperty; 

    var properties = []; 

    for (var property in obj) 
     if (hasOwnProperty.call(obj, property) 
      && typeof obj[property] !== "function") 
       properties.push(property); 

    return properties; 
} 

逐行上述代碼執行以下操作:

  1. 創建一個空數組properties持有的obj所有屬性的名稱。
  2. 對於objproperty每個屬性做:
    1. 如果屬性property屬於obj
    2. 如果obj[property]不是那麼功能:
      1. 屬性property添加到properties陣列。
  3. 返回的properties陣列。

觀看演示:http://jsfiddle.net/qVgVn/

+0

很深的解釋。非常感謝! –

+0

@PenghanYang檢查出http://stackoverflow.com/a/8159434/802397,這樣你就可以理解Aadit用hasOwnProperty.call做的事情 - 實質上,在某些瀏覽器(IE老版本)中,某些主機對象不會有一個hasOwnProperty函數,即使它在JS實現中可用。您可以通過從全局Object.prototype.hasOwnProperty調用它,然後使用call()將其應用於當前對象來獲取它。 – netpoetica

+0

@Keith另外,最終沒有從Object.prototype繼承的任何對象都很可能沒有'hasOwnProperty'方法。例如,通過調用Object.create(null)'創建的對象不具有'hasOwnProperty'函數。另外更不用說人們可以重寫'hasOwnProperty'方法:'{hasOwnProperty:function(){alert(「Trolled ya!」); }}。 –

1

你的代碼有很多問題。您需要的答案在MDN中是這樣的:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

該功能完全符合您的教授所要求的,並且它可以跨瀏覽器進行操作。在「兼容性」下列出了所謂的多填充或跨瀏覽器實現的object.keys。嘗試理清該代碼,找出它在做什麼:)

這裏有一些你自己的代碼的問題,我馬上看到了蝙蝠 - 它可能不是工作代碼,我只是想給你一些事情的指導你做了錯誤:

// Name your function something useful and descriptive. 
function getKeysAsArray(obj){ 
    // For starters, dont name a variable "array" - bad practice. 
    var key="", 
     i = 0, 
     results = []; 

    // First foor loop unnecessary, do not use arguments here 
    // because you already know the name of your argument. 
    for(key in obj){ 
     // See if this browser supports has OwnProperty by using typeof 
     // which will fail gracefully, vs what u did which will stop the 
     // script from running 
     if(typeof Object.hasOwnProperty === 'function'){ 
      // You probably shouldn't be using underscore _ 
      if(obj.hasOwnProperty && !(obj instanceof Array)){ 
       results.push(obj[key]); 
      } 
     } 
    } 

    return results; 
} 
+0

非常感謝。 「typeof Object.hasOwnProperty ==='function'」旨在檢查瀏覽器是否具有「.hasOwnProperty」方法? –

+0

@PenghanYang這是正確的 - typeof運算符將允許您查看對象的範圍,而不會中斷如果第一級未定義。例如,如果你試圖說如果(myObject.property)和myObject是未定義的,你會得到一個錯誤。但是如果你說,如果(typeof myObject.property ==='string'),myObject沒有被定義,你只會在你的if語句中得到一個false。 – netpoetica

1

確定在這裏我去...

function objProps(x){ 
var arr=[]; 
for (var k in x) if(typeof x[k] !='function' && x.hasOwnProperty(k)) {arr.push(k);} 
return arr; 
} 

此代碼按預期工作。用對象來稱呼它...

得到它唯一的鍵是非函數。

相關問題