Реструктуризация массива JSON объектов - PullRequest
1 голос
/ 26 мая 2020

У меня есть массив JSON объектов. Однако некоторые данные повторяются. Есть ли способ реструктурировать массив, чтобы исключить повторяющиеся значения? Обязательно ли использовать функцию карты? или a для l oop?

userData = [{id:'101', Time:'3:00pm', Date:'5/25/20'},
            {id:'101', Time:'5:00pm', Date:'5/25/20'},
            {id:'101', Time:'5:00pm', Date:'6/25/20'},
            {id:'105', Time:'1:00pm', Date:'3/25/20'},
            {id:'105', Time:'5:00pm', Date:'5/25/20'}
           ]

Можно ли так реструктурировать данные?

userData = [ {id:'101', Time:['3:00pm','5:00pm'], Date:['5/25/20', '6/25/20']},
             {id:'105', Time:['1:00pm','5:00pm'], Date:['3/25/20','5/25/20']}
           ]

Если у вас есть какие-либо указания или указания, мы будем очень признательны! Спасибо!

Ответы [ 4 ]

1 голос
/ 26 мая 2020
let userData = [{id:'101', Time:'3:00pm', Date:'5/25/20'},
        {id:'101', Time:'5:00pm', Date:'5/25/20'},
        {id:'101', Time:'5:00pm', Date:'6/25/20'},
        {id:'105', Time:'1:00pm', Date:'3/25/20'},
        {id:'105', Time:'5:00pm', Date:'5/25/20'}
       ]

let formattedUserData = {}

userData.forEach(user=>{
  if(!formattedUserData[user.id]) formattedUserData[user.id]= {
    id: user.id,
    Time: [],
    Date: [],
  }
  formattedUserData[user.id].Time.push(user.Time)
  formattedUserData[user.id].Date.push(user.Date)
})

const finalResponse = Object.entries(formattedUserData).map((e) => ( { ...e[1] } ));
console.log("finalResponse",finalResponse)
1 голос
/ 26 мая 2020

EDIT: исправлено, чтобы отфильтровать повторяющиеся DateTimes с сохранением соответствующего порядка с помощью Set () строк DateTime

Примечание: необязательное связывание ?. требует Chrome 80+ и Safari 13+. Используйте тройную проверку на неопределенность, если вам нужна совместимость.

Используйте карту объектов для отслеживания повторяющегося идентификатора, объедините с массивом времени, если он найден.

userData = [{id:'101', Time:'3:00pm', Date:'5/25/20'},
            {id:'101', Time:'5:00pm', Date:'5/25/20'},
            {id:'101', Time:'5:00pm', Date:'6/25/20'},
            {id:'105', Time:'1:00pm', Date:'3/25/20'},
            {id:'105', Time:'5:00pm', Date:'5/25/20'}
           ]
console.log(
Object.values(
userData.reduce((acc,{Time, id, Date})=>
  // [id] exists and does not contain DateTime
  acc[id]?.TD?.has(`${Date}_${Time}`)!== true ? 
  Object.assign(acc, {[id]:{
      id, 
      TD: (acc[id]?.TD||new Set()).add(`${Date}_${Time}`),
      Time: (acc[id]?.Time||[]).concat(Time),
      Date: (acc[id]?.Date||[]).concat(Date)
   }})
   : acc,{})
)
// get rid of TD Set, used only to prevent dupes
.map(({TD, ...o})=>o)
)
0 голосов
/ 26 мая 2020

Согласно MDN , Map подходит лучше, чем использование Object. Наборы используются для обеспечения дедупликации всех значений.

userData = [{id:'101', Time:'3:00pm', Date:'5/25/20'},
            {id:'101', Time:'5:00pm', Date:'5/25/20'},
            {id:'101', Time:'5:00pm', Date:'6/25/20'},
            {id:'105', Time:'1:00pm', Date:'3/25/20'},
            {id:'105', Time:'5:00pm', Date:'5/25/20'},
           ];

const structure = new Map();

userData.forEach(el => {
  const {t, d} = structure.get(el.id) || {t: new Set(), d: new Set()};
  structure.set(el.id, { t: t.add(el.Time), d: d.add(el.Date) });
});

const restructured = 
  [...structure].map(el => ( {id: el[0], Time: [...el[1].t], Date: [...el[1].d]} ))

console.log(restructured)
0 голосов
/ 26 мая 2020

Я так и сделал:

const userData = 
    [ { id: '101', Time: '3:00pm', Date: '5/25/20'} 
    , { id: '101', Time: '5:00pm', Date: '5/25/20'} 
    , { id: '101', Time: '5:00pm', Date: '6/25/20'} 
    , { id: '105', Time: '1:00pm', Date: '3/25/20'} 
    , { id: '105', Time: '5:00pm', Date: '5/25/20'} 
    ] 
      
const result = userData.reduce((a,{id,Time,Date})=>{
  let el = a.find(ud=>ud.id===id)
  if (!el) { el = {id, Time:[], Date:[]};  a.push(el) }
  if (!el.Time.includes(Time)) el.Time.push(Time)
  if (!el.Date.includes(Date)) el.Date.push(Date)
  return a
  }, [])

console.log( JSON.stringify(result,0,2) )
.as-console-wrapper { max-height: 100% !important; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...