1. 程式人生 > >js物件遍歷輸出順序錯亂的問題

js物件遍歷輸出順序錯亂的問題

、js物件遍歷順序錯亂的原因

下邊就來實踐一下:

var obj={'3':'ccc',name:'abc',age:23,school:'sdfds',class:'dfd',hobby:'dsfd'};
Object.keys(obj)

輸出:["3", "name", "age", "school", "class", "hobby"];

換一下物件順序,

var obj={name:'abc','3':'ccc',age:23,school:'sdfds',class:'dfd',hobby:'dsfd'};
Object.keys(obj)

輸出:["3", "name", "age", "school", "class", "hobby"]

所以,物件的遍歷輸出並不是按照順序來的,那麼是按照什麼規則來的呢,仔細深入研究你會發現,這還跟瀏覽器有關係,Chrome跟IE是不一樣的,所以給出以下結論:

Chrome Opera 的 JavaScript 解析引擎遵循的是新版 ECMA-262 第五版規範。因此,使用 for-in 語句遍歷物件屬性時遍歷書序並非屬性構建順序。
而 IE6 IE7 IE8 Firefox Safari 的 JavaScript 解析引擎遵循的是較老的 ECMA-262 第三版規範,屬性遍歷順序由屬性構建的順序決定。

Chrome Opera 中使用 for-in 語句遍歷物件屬性時會遵循一個規律:
它們會先提取所有 key 的 parseFloat 值為非負整數的屬性,然後根據數字順序對屬性排序首先遍歷出來,然後按照物件定義的順序遍歷餘下的所有屬性。

那麼,解決辦法呢?

可以把物件通過Object.keys提取物件的key出來變成陣列,然後通過陣列的排序,然後遍歷陣列,通過key去取物件的屬性值。

二、js陣列遍歷排序方法

  大家都知道陣列的遍歷是按照順序的,那麼當一個數組中放了很多物件,想要按照物件的某個屬性去排序陣列需要怎麼處理呢?

  1.定義一個方法:

var compare = function (prop) {
    return function (obj1, obj2) {
        var val1 = obj1[prop];
        var val2 = obj2[prop];if (val1 < val2) {
            return -1;
        } else if (val1 >www.wmyl11.com  val2) {
            return 1;
        } else www.thd178.com {
            return 0;
        }            
    } 
}
var arr=[{ name:"wlz", age:25},www.hjd1956.com{ name:"wlz",www.120xh.cn  age:5},{ name:"wlz", age:15},{ name:"wlz", age:3},{ name:"zlw", age:24}];
console.log(arr.sort(compare('age')))

最後這個陣列就根據屬性來做排序了。