2017-05-22 65 views
0
function removeDupes() { 
    var out = [], 
     obj = {}; 

    for (x = 0; x < intArray.length; x++) { 
    obj[intArray[x]] = 1; 
    } 
     for (x in obj) { 
     out.push(x); 
     } 
    return out; 
} 

大家好,obj {}應該被聲明爲一個對象,但爲什麼把[]和使用obj作爲數組工作?謝謝使用JavaScript對象作爲數組

+0

沒有給一個漫長的囉嗦答案。看看這個網站,可能會幫助你更好地理解JS。它爲我做.. https://addyosmani.com/resources/essentialjsdesignpatterns/book/#designpatternsjavascript – Tony

+0

你是什麼意思的「作品」?預期的結果是什麼?爲什麼它不工作?數組也只是具有鍵值對的對象。你使用數組作爲數字指標。 – Xufox

+0

https://stackoverflow.com/questions/4968406/javascript-property-access-dot-notation-vs-brackets – baao

回答

1

首先,讓我們加入intArray作爲參數,並宣佈循環迭代局部變量var x解決您的removedDupes功能:

function removeDupes(intArray) { 
    var out = [], 
     obj = {}; 

    for (var x = 0; x < intArray.length; x++) { 
    obj[intArray[x]] = 1; 
    } 
    for (var x in obj) { 
    out.push(x); 
    } 
    return out; 
} 

第一循環遍歷所有intArray元素。對於每個元素,它在obj上創建一個新屬性,密鑰爲intArray[x],值爲1,通過obj[intArray[x]] = 1。這被稱爲​​。現在,對象不能有重複的鍵。因此,兩次添加相同的屬性鍵實際上會覆蓋之前添加的屬性。因此,當循環完成時,您的obj每個唯一數組元素只有一個鍵。

第二個循環然後將這些鍵推入結果out陣列。

您的removeDupes函數存在一些問題。首先,即使輸入是一個number元素的數組,它也會返回一個string元素的數組。這是因爲obj鍵不能是數字,並且總是轉換爲字符串。您可以通過存儲與鑰匙一起的數值如下修正:

function removeDupes(intArray) { 
    var out = [], 
     obj = {}; 

    for (var x = 0; x < intArray.length; x++) { 
    obj[intArray[x]] = intArray[x]; 
    } 
    for (var x in obj) { 
    out.push(obj[x]); 
    } 
    return out; 
} 

現在,這個工作,但它是非常冗長。通過用return Object.values(obj);替換第二個循環,可以縮短它。甚至更短,通過使用一個Set

function removeDupes(intArray) { 
    return [...new Set(intArray)]; 
} 
4

someObject["somePropertyName"]是你如何訪問一個對象的屬性。 (您也可以使用someObject.somePropertyName,但僅當屬性名稱是有效的標識符時)。

該語法與數組無關。

數組只是一種對象類型,有一堆方法以特殊方式處理屬性名稱爲整數。

(數字不是有效的標識符,因此您必須使用方括號語法來訪問名稱爲數字的屬性)。