lodash: объединение массивов объектов - PullRequest
0 голосов
/ 27 ноября 2018

Я хотел бы объединить массив объектов, как показано ниже:

[{end: 1, start: 10},
 {end: 11, start: 20},
 {end: 21, start: 29}]

Если array[i].start == array[i+1].end + 1, объединить их, например,

перед:

[{end: 1, start: 10},
{end: 11, start: 20}]

после:

{end: 1, start: 20}

Не знакомы с lodash, есть ли простой способ реализовать его?

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Вам не нужно использовать lodash для этого.с ES6 это будет всего один Array.reduce:

const data = [{ end: 1, start: 10 }, { end: 11, start: 20 } ] 

const result = data.reduce((r,c,i) => {
  r.end = c.end < r.end || i == 0 ? c.end : r.end
  r.start = c.start > r.start ? c.start : r.start
  return r
}, { end: 0, start: 0 })

console.log(result)

С помощью lodash вы можете сделать что-то вроде этого:

const data = [{ end: 1, start: 10 }, { end: 11, start: 20 }] 

const r = _.merge(_.minBy(data, 'end'), _.pick(_.maxBy(data,'start'), 'start'))

console.log(r)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

Идея состоит в том, чтобы получить максимум и минимум, а затем объединить объекты.Однако хитрость заключается в том, чтобы только выбрать свойство start в слиянии, чтобы не перезаписывать end.

0 голосов
/ 27 ноября 2018

Попробуйте это:

    var obj = [{end: 1, start: 10},{end: 11, start: 20},{end: 21, start: 29}]
    var max = { start: _.maxBy( obj, "start" ).start }
    var min = { end: _.minBy( obj, "end" ).end }

    _.extend(max,min)

   //{start: 29, end: 1}
...