JS:对象的有序迭代

时间:2017-07-28 18:16:38

标签: javascript arrays object

有一个像这样的对象......

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

...我需要按升序访问子元素。这意味着我想先处理2016对象,然后再处理2017对象。

其中我需要按升序处理月份对象。

Iteration like ...

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

将无法正常完成工作。

3 个答案:

答案 0 :(得分:2)

要获取内容的有序数组,递归迭代对象,同时按排序键获取数据,并使用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);

答案 1 :(得分: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}`)));

答案 2 :(得分: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]);
    }