Как разбить объект с массивом внутри на объекты с каждым элементом из массива?

Здравствуйте, есть такой массив объектов:
let segments = [
  {
    "value": [2,1,5,7],
    "text": {
    	"hi": "hello"
    },
    "diff": 1
  },
  {
    "value": [5,6],
    "text": {
    	"hi": "bye"
    },
    "diff": 2
  }
]


необходимо с помощью reduce привести его к следующему виду:
let segments = [
  {
    "value": 2,
    "text": {
    	"hi": "hello"
    },
    "diff": 1
  },
  {
    "value": 1,
    "text": {
    	"hi": "hello"
    },
    "diff": 1
  },
  {
    "value": 5,
    "text": {
    	"hi": "hello"
    },
    "diff": 1
  },
  {
    "value": 7,
    "text": {
    	"hi": "hello"
    },
    "diff": 1
  },
  {
    "value": 5,
    "text": {
    	"hi": "bye"
    },
    "diff": 2
  },
  {
    "value": 6,
    "text": {
    	"hi": "bye"
    },
    "diff": 2
  }
]
  • Вопрос задан
  • 764 просмотра
Решения вопроса 2
Stalker_RED
@Stalker_RED
let result = segments.reduce(foo, [])

function foo (acc, segment){
  segment.value.forEach(val => {
    let newSegment = Object.assign({}, segment)
    newSegment.value = val
    acc.push(newSegment)
  })
  return acc
}




То-же самое в одну строку, чтобниктонедогадался
let result = segments.reduce((a,s)=>a.concat(s.value.map(v=>Object.assign({},s,{value:v}))),[])
Ответ написан
Комментировать
sergiks
@sergiks Куратор тега JavaScript
♬♬
  • map() это многомного
  • reduce() это многоодин
В вашей задаче надо из массива values получить массив объектов с полями родителя (это map()).
А потом последовательно склеить несколько массивов в один (это можно через reduce()).

let result = segments
  .map(e => e.value.map(
    v => ({
      value: v,
      text : { hi: e.text.hi},
      diff : e.diff
    })
  ))
  .reduce((prev, curr) => prev.concat(curr), [])
;
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы