2017-07-28 68 views
2

有這樣一個對象的有序迭代...JS:對象

{ 
    2016: { 
    3 : [ 
     { field: "content 1" } 
     { field: "content 2" } 
    ] 
    10 : [ 
     { field: "content 3" } 
    ] 
    } 
    2017: { 
    8 : [ 
     { field: "content 4" } 
    ] 
    } 
} 

...我需要得到以升序訪問子元素。這意味着我想先處理2016年的對象,然後再處理2017年的對象。

其中我還需要按升序來處理月份對象。

迭代像...

for (var year in map) { 
    if (map.hasOwnProperty(year)) { 
     console.log(year) 
    } 
} 

不會做的工作做好。

+0

中有對象沒有訂單,你就必須創建自己的地圖,並按照。 – adeneo

+0

javascript無法對映射進行排序抱歉,您將不得不像做'2016:{year:2016,...}'等對象那樣添加額外屬性,然後將映射轉換爲數組,然後將排序排列數年 –

回答

0

Javascript對象沒有排序,因此您需要做的第一件事就是抓住鍵,對它們進行排序,然後按照該順序進行迭代。

data = { 
 
     2016: { 
 
     3 : [ 
 
      { field: "content 1" }, 
 
      { field: "content 2" }, 
 
     ], 
 
     10 : [ 
 
      { field: "content 3" }, 
 
     ], 
 
     }, 
 
     2017: { 
 
     8 : [ 
 
      { field: "content 4" }, 
 
     ], 
 
     }, 
 
    }; 
 
    
 
    var keys = Object.keys(data); 
 
    var sortedKeys = keys.sort(function(a, b) {return parseInt(a) - parseInt(b)}); 
 
    
 
    for (var i = 0; i < sortedKeys.length; i++) { 
 
     var key = sortedKeys[i]; 
 
     console.log(data[key]); 
 
    }

2

獲取內容的有序陣列,遞歸地迭代對象,而排序鍵獲得數據,並且使用陣列#CONCAT扁平化陣列。

var data = {"2016":{"3":[{"field":"content 1"},{"field":"content 2"}],"10":[{"field":"content 3"}]},"2017":{"8":[{"field":"content 4"}]}}; 
 

 
function iterateByOrder(data) { 
 
    var sorterKeys = Object.keys(data).sort(function(a, b) { 
 
    return a - b; // sort by converting the keys to numbers 
 
    }); 
 
    
 
    return [].concat.apply([], sorterKeys.map(function(key) { // mapping the propeties to values, and flatting sub arrays 
 
    return typeof data[key] === 'object' ? iterateByOrder(data[key]) : data[key]; 
 
    })); 
 
} 
 

 
var result = iterateByOrder(data); 
 

 
console.log(result);

2

我們將編寫的Array#forEach一點的模擬,它比在有序對象的鍵/值對迭代,並呼籲每一對的功能,通過它的關鍵並將其值:

function forEach(object, fn) { 
    object.entries() . sort((a, b) => a[0] - b[0]) . forEach(pair => fn(...pair)); 
} 

如果你沒有Object#entries,自己動手寫:

function objectEntries(object) { 
    return Object.keys(object) . map(key => [key, object[key]]); 
} 

我們遍歷你的對象:

forEach(map, (year, yearValue) => 
    forEach(yearValue, (month, monthValue) => 
    console.log(`At ${year}/${month}, got data ${monthValue}`)));