簡體   English   中英

Javascript 對象中的排序鍵

[英]Sort Keys in Javascript Object

我有一個 Javascript 對象,它包含多種屬性類型,包括簡單的字符串、對象、對象數組……等等。

我想按照此規則對鍵進行排序:

'像字符串或數字這樣的簡單屬性總是出現在包含數組或對象的更復雜的屬性之前'

我編寫了以下函數,幾乎可以完成我想要實現的功能,但它將數組轉換為對象。 這不是理想的行為。 誰能幫我創建一個函數,將數組保存為數組,同時對數組內的對象進行排序?

function sort(object){
    if (typeof object != "object" )
        return object;
    var keys = Object.keys(object);
    keys.sort(function(a,b){
            if (typeof(object[a])!== 'object') { return -1 } else { return 1 }
        });

工作jsfiddle:

http://jsfiddle.net/u01mn2py/3/

親切的問候

從 ECMAScript 2015 (ES6) 開始,對象自己的屬性確實對某些操作具有順序,盡管依賴它很少是一個好主意。 如果你想要順序,通常最好使用數組或類似的。

順序是:

  1. 成為一個新的空列表。
  2. 對於作為整數索引的O 的每個自己的屬性鍵P ,按升序數字索引順序
    • 添加P作為keys的最后一個元素。
  3. 對於是字符串但不是整數索引的O 的每個自己的屬性鍵P ,按屬性創建順序
    • 添加P作為keys的最后一個元素。
  4. 對於作為符號的O 的每個自己的屬性鍵P ,按屬性創建順序
    • 添加P作為keys的最后一個元素。
  5. 返回

那是“自己的”屬性。 我認為沒有任何外部可用操作為所有屬性(包括繼承的屬性)定義所需的順序。 for-in不需要遵循上面的順序,即使在 ES2015+ 中也不需要。)從 ES2019 開始, for-in確實有一個定義的順序(有一些例外)

這意味着如果我們的鍵都不符合整數索引的條件,則可能可以在兼容引擎上執行您的要求。

JSON 仍然沒有順序,但 JavaScript 規范要求JSON.stringify使用上述順序。

我不是說我建議它。 :-)

function sort(object) {
    // Don't try to sort things that aren't objects
    if (typeof object != "object") {
        return object;
    }

    // Don't sort arrays, but do sort their contents
    if (Array.isArray(object)) {
        object.forEach(function(entry, index) {
            object[index] = sort(entry);
        });
        return object;
    }

    // Sort the keys
    var keys = Object.keys(object);
    keys.sort(function (a, b) {
        var atype = typeof object[a],
            btype = typeof object[b],
            rv;
        if (atype !== btype && (atype === "object" || btype === "object")) {
            // Non-objects before objects
            rv = atype === 'object' ? 1 : -1;
        } else {
            // Alphabetical within categories
            rv = a.localeCompare(b);
        }
        return rv;
    });

    // Create new object in the new order, sorting
    // its subordinate properties as necessary
    var newObject = {};
    keys.forEach(function(key) {
        newObject[key] = sort(object[key]);
    });
    return newObject;
}

現場示例(我還更新了小提琴):

 function sort(object) { // Don't try to sort things that aren't objects if (typeof object != "object") { return object; } // Don't sort arrays, but do sort their contents if (Array.isArray(object)) { object.forEach(function(entry, index) { object[index] = sort(entry); }); return object; } // Sort the keys var keys = Object.keys(object); keys.sort(function (a, b) { var atype = typeof object[a], btype = typeof object[b], rv; if (atype !== btype && (atype === "object" || btype === "object")) { // Non-objects before objects rv = atype === 'object' ? 1 : -1; } else { // Alphabetical within categories rv = a.localeCompare(b); } return rv; }); // Create new object in the new order, sorting // its subordinate properties as necessary var newObject = {}; keys.forEach(function(key) { newObject[key] = sort(object[key]); }); return newObject; } var object = { family: [{ home: { city: 'Madrid' }, birth: { city: 'Madrid' }, name: 'John', age: 32 }, { home: { city: 'London' }, birth: { city: 'Paris' }, name: 'Marie', age: 25 }], name: 'Dani', age: 33 }; var sortedObject = sort(object); document.getElementById('container').innerHTML = JSON.stringify(sortedObject, null, '\\t');
 <pre id="container"> </pre>

(您沒有要求在類別內按字母順序排列,但扔進去似乎是一件合理的事情。)

這適用於我當前的 Chrome、Firefox 和 IE11。

我知道我無法傳遞 javascript 屬性順序,但我需要在視覺上顯示排序的 JSON。 以這種方式解決:

http://jsfiddle.net/u01mn2py/4/

function sort(object){
    if (typeof object != "object" ) // Not to sort the array
        return object;
    var keys = Object.keys(object);
    keys.sort(function(a,b){
            if (typeof(object[a])!== 'object') { return -1 } else { return 1 }
        });
    if( Object.prototype.toString.call( object ) === '[object Array]' ) {
        var newObject = [];
     } else {
        var newObject = {}; }

     for (var i = 0; i < keys.length; i++){
            newObject[keys[i]] = sort(object[keys[i]])
      }
    return newObject;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM