简体   繁体   中英

Transforming an array to a sorted object

I have in input an array of arrays such as:

[
  [ '1', '12:23', '16:27' ],
  [ '1', '08:00', '17:59' ],
  [ '2', '14:50', '15:14' ],
  [ '2', '09:42', '11:00' ],
  [ '3', '17:16', '17:41' ],
  [ '3', '08:00', '17:59' ],
  [ '4', '08:10', '13:01' ],
]

I'd like to be able to use the first element of the arrays as a key object, to store the second and third element in it, sorted by the second one, as this:

  {
    1: [
      ['08:00', '17:59'],
      ['12:23', '16:27'],
    ],
    2: [
      ['09:42', '11:00'],
      ['14:50', '15:14'],
    ]
    3: [
      ['08:00', '17:59'],
      ['17:16', '17:41'],
    ]
    4: [
      ['08:10', '13:01'],
    ]      
  }

Hints?

Converting an array into an object is an ideal candidate for using Array.prototype.reduce() :

 const arr = [ [ '1', '12:23', '16:27' ], [ '1', '08:00', '17:59' ], [ '2', '14:50', '15:14' ], [ '2', '09:42', '11:00' ], [ '3', '17:16', '17:41' ], [ '3', '08:00', '17:59' ], [ '4', '08:10', '13:01' ], ]; const obj = arr.reduce((acc, item) => { const [key, timeA, timeB] = item; // create array of time pairs if necessary acc[key] = acc[key] || []; // add time pairs to array acc[key].push([timeA, timeB]); return acc; }, {}); // sort the time pair arrays by the first time const compare = (a, b) => { const aTime = a[0], bTime = b[0]; return aTime.localeCompare(bTime); }; Object.values(obj).forEach(arr => { arr.sort(compare); }); document.querySelector('pre').innerText = 'obj ' + JSON.stringify(obj, null, 2);
 <pre></pre>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM