按嵌套属性排序对象数组

时间:2017-04-30 19:47:53

标签: javascript arrays sorting

我希望能够通过嵌套对象来排序数组。 我有这个数组包含有关时间轴上的对象的信息,我可以通过嵌套数组中定义的start位置对此进行排序。我可以使用lines[0].events[0].start

通过数组进行迭代

这是数组:

timelines = [
    {
    name: 'obj1',
        data: { id : 'obj1-guid' },
        lines: [{
          events: [{
            name: 'animation1',
            data : { id : 'animation1-guid' },
            start : 100,
            duration : 200
          }]
        }],
        video_url: 'url',
    },
    {
    name: 'obj2',
        data: { id : 'obj2-guid' },
        lines: [{
          events: [{
            name: 'animation1',
            data : { id : 'animation1-guid' },
            start : 4,
            duration : 200
          }]
        }],
        video_url: 'url',
    },
    {
    name: 'obj3',
        data: { id : 'obj3-guid' },
        lines: [{
          events: [{
            name: 'animation1',
            data : { id : 'animation1-guid' },
            start : 56,
            duration : 200
          }]
        }],
        video_url: 'url',
    },

];

我尝试过像这样的功能

function sorting(json_object, key_to_sort_by) {
          function sortByKey(a, b) {
              var x = a[key_to_sort_by];
              var y = b[key_to_sort_by];
              return ((x < y) ? -1 : ((x > y) ? 1 : 0));
          }
          json_object.sort(sortByKey);
        }

 timelines = sorting(timelines, 'lines[0].events[0].start');

但当然不能正常工作

2 个答案:

答案 0 :(得分:1)

只是常规sort

timelines = [
    {
    name: 'obj1',
        data: { id : 'obj1-guid' },
        lines: [{
          events: [{
            name: 'animation1',
            data : { id : 'animation1-guid' },
            start : 100,
            duration : 200
          }]
        }],
        video_url: 'url',
    },
    {
    name: 'obj2',
        data: { id : 'obj2-guid' },
        lines: [{
          events: [{
            name: 'animation1',
            data : { id : 'animation1-guid' },
            start : 4,
            duration : 200
          }]
        }],
        video_url: 'url',
    },
    {
    name: 'obj3',
        data: { id : 'obj3-guid' },
        lines: [{
          events: [{
            name: 'animation1',
            data : { id : 'animation1-guid' },
            start : 56,
            duration : 200
          }]
        }],
        video_url: 'url',
    },

];

const r = timelines.sort((a,b) => a.lines[0].events[0].start - b.lines[0].events[0].start);

console.log(r)

答案 1 :(得分:1)

您可以为[].sort

提供自定义排序功能

对于ASC排序,你可以做

timelines.sort( function(a, b){ 
    return a.lines[0].events[0].start - b.lines[0].events[0].start
})

对于DESC

timelines.sort( function(a, b){ 
    return b.lines[0].events[0].start - a.lines[0].events[0].start
})

您可以从MDN

了解有关如何评估比较功能的更多信息
  

如果提供compareFunction,则根据compare函数的返回值对数组元素进行排序。如果a和b是要比较的两个元素,那么:

     
      
  • 如果compareFunction(a,b)小于0,则将a排序为低于b的索引,即a先出现。
  •   
  • 如果compareFunction(a,b)返回0,则保持a和b相对于彼此保持不变,但是对所有不同的元素进行排序。注意:ECMAscript标准不保证这种行为,因此并非所有浏览器(例如可追溯到至少2003年的Mozilla版本)都尊重这一点。
  •   
  • 如果compareFunction(a,b)大于0,则将b排序为低于a的索引。
  •   
  • compareFunction(a,b)在给定一对特定元素a和b作为其两个参数时必须始终返回相同的值。如果返回不一致的结果,则排序顺序未定义。
  •