2015-08-09 70 views
-1

我有一個對象(散列數組),我需要將其轉換爲有序的鍵值對。如何從函數返回有序的鍵/值對?

這是對象:

var places_info = [ 
    {"place_id":180,"name":"Abc","city":"Gotham"}, 
    {"place_id":161,"name":"Def","city":"Sin City"}, 
    {"place_id":178,"name":"Ghi","city":"Timbuktu"}, 
    {"place_id":179,"name":"Jkl","city":"Acapulco"}, 
    {"place_id":174,"name":"Mno","city":"Desire"} 
]; 

我需要的功能(通過name字母)在同一個返回鍵/值(place_id/name)對順序:

{ 
    '180': 'Abc', 
    '161': 'Def', 
    '178': 'Ghi', 
    '179': 'Jkl', 
    '174': 'Mno' 
} 

實際使用 :我需要它作爲輸入Jeditable選擇輸入(在demo頁面上的實際示例)。 data - 屬性鍵/值對的選擇類型需求或返回它們的函數。到目前爲止,我有隨機順序的選擇選項,但 - 正如你可能想象的 - 我需要他們按價值排序....

至於Jeditable的數據可能只是一個假哈希(字符串形成JSON鍵/值對),我唯一的解決方案是這樣的:

var arr = new Array; 
for (i in places_info) { 
    arr.push("'" + places_info[i].place_id + "':'" + places_info[i].name + "'"); 
} 
var uglyString = '{' + arr.join(',') + '}'; 

是否有一些更優雅和直觀的方法來實現這樣的目標?我想讓我的數據保持正確的數據結構。將它轉換爲平坦的字符串看起來像是黑客。

編輯

我必須重新考慮這個問題。我沒有用生成的字符串測試Jeditable,並且似乎將字符串轉化爲哈希,然後我的期望順序消失了。所以,這個問題需要不同的方法。也許我需要爲Jeditable製作自己的數據類型。但這似乎是不同的問題。

+0

由於JavaScript不保證你在一個對象的鍵的順序,我想你沒有別的選擇。我希望,這篇文章可能會幫助你一點http://stackoverflow.com/questions/5525795/does-javascript-guarantee-object-property-order – Rudra

回答

2

直到ES6,Javascript對象上的屬性沒有保證順序。他們是無序的。如果您需要訂單並需要在ES6之前支持環境,那麼您不能僅僅在對象上使用屬性並獲得這些屬性的保證順序。

所以你的選擇是選擇一些其他可以可靠地表達順序的數據結構。把它摺疊成像你所做的一樣的字符串是一種選擇,但這意味着它必須被重新解析才能對Javascript有用。最好將它保存在一些本地可訪問的Javascript格式中。對於訂單來說,這意味着使用一個數組。


您可以通過爲排序返回一個數組來返回有序對,然後有幾種選擇來放入數組。以下是有序的鍵/值對的幾個例子:

// array of objects 
var a = [{key: "greeting", value: "hello"}, {key: "salutation", value: "welcome"}]; 

因爲這似乎有點冗長給我,我經常使用,只是知道,所有其他元素是關鍵,那麼值,然後鍵,然後一個快捷方式價值不必一遍又一遍拼出那些屬性名稱:

// alternating key/value 
var a = ["greeting", "hello", "salutation", "welcome"]; 

或者,你可以把每一個有序對陣列中的本身,以便每個子陣是一個有序對:

// sub-arrays 
var a = [["greeting", "hello"], ["salutation", "welcome"]]; 
+0

Jeditable數據屬性需要鍵/值對,我不能使用數組。 –

+0

@ w.k - 如果你想在Javascript中控制順序,你可以使用數組。您不容易操縱對象上的屬性順序。事實上,在ES6之前,對象上的屬性沒有保證順序。所以,因爲你說你想要訂單,所以我建議了一個數組 - 這是Javascript用於訂單的東西。如果你可以使用字符串(yuk),那麼爲什麼你不能使用數組?我不明白。我只是認爲你正在試圖找到有組織的方式來存儲有序的鍵/值對。 – jfriend00

+0

我認爲你是對的,因爲即使使用字符串也不能按我的預期工作。看我的編輯。謝謝! –

0

Th在JavaScript中不保證對象中的屬性順序,您需要使用數組。

在此請看:

var obj = { 
    '180': 'Abc', 
    '161': 'Def', 
    '178': 'Ghi', 
    '179': 'Jkl', 
    '174': 'Mno' 
}; 
for (var i in obj) { console.log(i); }; 

會給你: 161,174,178,179,180