如何比较嵌套JSON数组中的数组?

时间:2017-04-10 13:06:53

标签: javascript arrays json

我在数组中有以下数据:

 [{
  Credits: '4',
  Name: 'Computer Science 250: Introduction to Website Design',
  Classes: 
   [ 
      { Day: 'Mon',
       EndTime: '{ts \'1970-01-01 18:00:00\'}',
       StartTime: '{ts \'1970-01-01 16:30:00\'}' },
      { Day: 'Wed',
       EndTime: '{ts \'1970-01-01 18:00:00\'}',
       StartTime: '{ts \'1970-01-01 16:30:00\'}' },
      { Day: 'Fri',
       EndTime: '{ts \'1970-01-01 18:00:00\'}',
       StartTime: '{ts \'1970-01-01 16:30:00\'}' } ] }

  {
  Credits: '3',
  Name: 'Math 220: Differential Equations',
  Classes: 
   [ 
      { Day: 'Mon',
       EndTime: '{ts \'1970-01-01 18:30:00\'}',
       StartTime: '{ts \'1970-01-01 17:30:00\'}' },
     { Day: 'Wed',
      EndTime: '{ts \'1970-01-01 18:30:00\'}',
      StartTime: '{ts \'1970-01-01 17:30:00\'}' },
     { Day: 'Fri',
      EndTime: '{ts \'1970-01-01 18:30:00\'}',
      StartTime: '{ts \'1970-01-01 17:30:00\'}' } ] }]

问题是我必须通过EndTime对数据进行排序(只有这部分数据是有序的,其余的不是)我该怎么做?

或者我怎样才能根据内部数组的属性对数据进行排序?

我正在使用javascript。

修改

问题是找出json数组中提供的主题是否会根据开始和结束时间发生冲突,例如上述主题同时发生,因此它们会发生冲突。

2 个答案:

答案 0 :(得分:0)

通过解析你的Json(使用JSON.parse,例如:p)开始你的工作

当您拥有自己的javascript数组时,您可以非常简单地使用排序功能(如果您能够解析日期)。

例如,在这里我按照TYPE(PHYSIQUE before others)和字母顺序对数组进行排序:

return $.map(caracInfos, function (caracInfo) {
        return new CaracInfo(caracInfo);
    }).sort(function (caracInfo1, caracInfo2) {
        if (caracInfo1.type === caracInfo2.type) return caracInfo1.carac.localeCompare(caracInfo2.carac);
        if (caracInfo1.type === CaracInfo.TYPES["PHYSIQUE"]) return -1;
        if (caracInfo2.type === CaracInfo.TYPES["PHYSIQUE"]) return 1;
        return 0;
    });

答案 1 :(得分:0)

您可以获取内部数组,使用课程名称(或所有课程信息)扩展其元素,并将它们连接在一起,最后使用自定义比较函数对它们进行排序:



function byDayTime(schedule) {
    const weekDays = {Mon:1, Tue:2, Wed:3, Thu:4, Fri:5};
    return schedule.reduce( (acc, course) => 
        acc.concat(course.Classes.map( cls => 
            Object.assign({}, cls, { courseName: course.Name })
        ))
    , [] ).sort( (a, b) => 
        weekDays[a.Day] - weekDays[b.Day] || a.EndTime - b.EndTime 
    );
}

// Sample data
const schedule = [{
    Credits: '4',
    Name: 'Computer Science 250: Introduction to Website Design',
    Classes: [{
        Day: 'Mon',
        EndTime: '{ts \'1970-01-01 18:00:00\'}',
        StartTime: '{ts \'1970-01-01 16:30:00\'}'
    }, { Day: 'Wed',
        EndTime: '{ts \'1970-01-01 18:00:00\'}',
        StartTime: '{ts \'1970-01-01 16:30:00\'}'
    }, { Day: 'Fri',
        EndTime: '{ts \'1970-01-01 18:00:00\'}',
        StartTime: '{ts \'1970-01-01 16:30:00\'}'
    }] 
}, {
    Credits: '3',
    Name: 'Math 220: Differential Equations',
    Classes: [{ 
        Day: 'Mon',
        EndTime: '{ts \'1970-01-01 18:30:00\'}',
        StartTime: '{ts \'1970-01-01 17:30:00\'}'
    }, { 
        Day: 'Wed',
        EndTime: '{ts \'1970-01-01 18:30:00\'}',
        StartTime: '{ts \'1970-01-01 17:30:00\'}'
    }, { 
        Day: 'Fri',
        EndTime: '{ts \'1970-01-01 18:30:00\'}',
        StartTime: '{ts \'1970-01-01 17:30:00\'}'
    }] 
}];

// Get array ordered by day/time:
const result = byDayTime(schedule);

console.log(result);

.as-console-wrapper { max-height: 100% !important; top: 0; }