2017-07-28 60 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}`)));