簡體   English   中英

JS:對象的有序迭代

[英]JS: Ordered iteration of object

有一個像這樣的東西...

{
  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)
    }
}

將無法正常工作。

要獲取內容的有序數組,請遞歸地迭代對象,同時通過排序的鍵獲取數據,並使用Array#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); 

我們將編寫一個類似於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}`)));

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]); } 

暫無
暫無

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

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