Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS:对象的有序迭代_Javascript_Arrays_Object - Fatal编程技术网

Javascript JS:对象的有序迭代

Javascript JS:对象的有序迭代,javascript,arrays,object,Javascript,Arrays,Object,有一个像这样的物体 { 2016: { 3 : [ { field: "content 1" } { field: "content 2" } ] 10 : [ { field: "content 3" } ] } 2017: { 8 : [ { field: "content 4" } ] } } …我需要以升序访问子元素。这意味着我要先处理2016年对象,然后再处理2017年对象

有一个像这样的物体

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

无法正确执行此任务。

Javascript对象没有顺序,因此您需要做的第一件事是获取键,对它们进行排序,然后按顺序进行迭代

数据={
2016: {
3 : [
{字段:“内容1”},
{字段:“内容2”},
],
10 : [
{字段:“内容3”},
],
},
2017: {
8 : [
{字段:“内容4”},
],
},
};
var keys=Object.keys(数据);
var sortedKeys=keys.sort(函数(a,b){return parseInt(a)-parseInt(b)});
对于(变量i=0;i}
要获取内容的有序数组,递归地迭代对象,同时通过排序键获取数据,并使用array#concat展平数组

var data={“2016”:{“3”:[{“字段”:“内容1”}、{“字段”:“内容2”}]、“10”:[{“字段”:“内容3”}]},“2017”:{“8”:[{“字段”:“内容4”}]};
函数迭代器(数据){
var sorterKeys=对象.键(数据).排序(函数(a,b){
返回a-b;//通过将键转换为数字进行排序
});
返回[].concat.apply([],sorterKeys.map(函数(键){//将属性映射到值,并展开子数组
返回数据类型[key]=“object”?迭代器(数据[key]):数据[key];
}));
}
var结果=迭代器(数据);

控制台日志(结果)我们将编写一个模拟的
数组#forEach
,它按排序顺序迭代对象中的键/值对,并在每对上调用一个函数,将键及其值传递给它:

function forEach(object, fn) {
  object.entries() . sort((a, b) => a[0] - b[0]) . forEach(pair => fn(...pair));
}
如果您没有
对象#条目
,请自己编写:

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无法对映射进行排序抱歉,您必须在对象中添加一个额外的属性,如
2016:{year:2016,…}
,然后将映射转换为数组,然后按年份对数组进行排序