2014-02-20 24 views

回答

17

.pop只能陣列上。在JavaScript中,對象(基本上是關聯數組)不會像數組那樣排序,因此沒有.pop方法。

你可以使用一個數組:

var deck = [ 
    { key: 'cardK', val: 13 }, 
    { key: 'cardQ', val: 12 }, 
    { key: 'cardAJ', val: 11 }, 
]; 

var val = deck.pop(); 
console.log('key: ' + val.key); 
console.log('aa: ' + val.val); 
3

你是對的,這是不可能的。見對象作爲映射哈希表,而不是「關聯數組」。這些屬性沒有順序,因此.pop等方法沒有意義(除非它將刪除隨機屬性,例如Python的字典)。

如果你想使用.popval.keyval.val,你必須創建對象的數組來代替:

var deck = [ 
    {key: 'cardK', val: '13'}, 
    {key: 'cardQ', val: '12'}, 
    {key: 'cardAJ', val: '11'} 
]; 
4

正如其他的答案建議,在這裏最好的解決辦法可能是使用對象的數組。然而,你也可以創建自己的流行功能,可以消除目標的關鍵,例如:

function pop(obj) { 
    var key = Object.keys(obj).pop(); 
    var result = {key: key, val: obj[key]}; 
    delete obj[key]; 
    return result; 
} 

var val = pop(deck); 

你可以添加一個類似pop功能Object.prototype,這樣你可以做deck.pop(),但我強烈建議針對設計類型。

+0

爲什麼推薦反對這些結構?在某些情況下,它們提供最高級別的性能,例如,當您需要知道cardQ'var x = deck ['cardQ']的值時,'比通過查看對象的數組循環快得多。 –

+0

@BrianMcGinity這是一般不好的做法,並打破封裝https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Inheritance_and_the_prototype_chain#Bad_practice.3A_Extension_of_native_prototypes。目前它只能打破'for ... in',因爲你的Object.prototype.addedStuff將被列出,除非你檢查Object.hasOwnProperty.call(obj,key)'並且有人認爲使用'for ... in'是不管怎麼樣(不檢查hasOwnproperty),但它仍然打破封裝。你正在改變原型中的JavaScript,他們不是你的改變。 – HMR

+1

@HMR,我說可以使用通過字符串索引的對象數組,並且在許多情況下,它通過數字索引來優先於索引數組。我並不是想暗示重新定義Prototye pop()或任何原型是一個好主意。 –

1

我相信你知道,.pop是一個原型Array方法,所以你不能在Javascript對象中使用它。

在陣列上調用.pop將從陣列中刪除最後的元素。但是,不存在與對象的「最後」鍵 - 值對,因爲它們的順序無法保證。儘管這樣,如果你不關心順序,你可以實現與對象使用.pop般的功能,不過,再次,它不會刪除,並返回最終鍵值對。

像這樣的東西應該做的伎倆:

function pop(obj) { 
    for (var key in obj) { 
    var val = obj[key]; 
    delete obj[key]; 
    return { 
     'key' : key, 
     'val' : val, 
    }; 
    }; 
}; 

與您的代碼組合:

var val = pop(deck); 
console.log('key: ' + val.key); 
console.log('aa: ' + val.val); 
+0

F.J.在20分鐘前已經提供了[類似的答案](http://stackoverflow.com/a/21899957/218196)。 –

+0

@FelixKling如果我不認爲我的答案更深入,我會刪除它。在我看來,這比[回答「這是不可能的」並提供需要不同數據結構的解決方法]更有價值(http://stackoverflow.com/a/21899878/2539700)。 –

+0

這不危險嗎?我不認爲這是安全的。雖然它在大多數情況下都可以工作,但我不認爲你可以在這裏假設第一個事務的輸入返回將是添加到數組中的最後一項。你可能想要實現一個'鍵控'堆棧,以便知道彈出窗口工作正常。 Pop應該總是刪除並給你添加到數組中的最後一項。很容易通過和int索引,但鍵/ hases沒有這樣做。 – Quadrivium

1

當這種結構,它可以被看作是一個關聯數組工作,你需要使用不同的技術。像pop(),slice()甚至.length這樣的東西不會像數字鍵控數組那樣工作。

搜索的鍵/值對的時候需要做的快,我使用字符串鍵對象數組。

這裏有一個jsPef我剛剛創建這說明你的陣列結構的好處:

http://jsperf.com/bmcgin-object-array-tests(記住性能就會出現一路上漲的陣列變得更大)

還要記住的值可以是一個數字,一個字符串,一個數組,一個函數,一個對象等...