Как разделить строку (объект) для «сохранения» в новом элементе?

#javascript #arrays #sorting #object

#javascript #массивы #сортировка #объект

Вопрос:

Я получаю этот файл json:

 var data = [  
   {  
      "id":"1",      
      "yMonth":"201901",
   },
   {  
      "id":"2",      
      "yMonth":"201902",
   },
   {  
      "id":"3",      
      "yMonth":"201802",
   },
   {  
      "id":"4",      
      "yMonth":"202003",
   }
]
  

Мой yMonth содержит объединенные год и месяц (201901 -> год: 2019, месяц: 01). Итак, я пытаюсь разделить мой yMonth на два новых элемента, сортируя по year и month .

Чтобы получить такой возврат:

 [  
    {  
      "id":"1",      
      "year":"2019",
      "month":"01",
    },
    {  
      "id":"2",      
      "year":"2019",
      "month":"02",
    },
    {  
      "id":"3",      
      "year":"2018",
      "month":"02",
    },
    {  
      "id":"4",      
      "year":"2020",
      "month":"03",
    }
]
  

Один из способов, о котором я думал, это начать так:

 data.forEach(item => {
  item.yMonth..... 
   //Split string, maybe save temporarily in aux variable, create a new array with: `year` and `month` items
 })
  

Кто-нибудь может мне помочь? Я действительно запутался в том, как это сделать

Ответ №1:

  item.month = item.yMonth.slice(4);
 item.year = item.yMonth.slice(0, 4);
 delete item.yMonth;
  

Ответ №2:

Выполните итерацию массива с помощью Array.map() . На карте отделить yMonth от объекта с помощью деструктурирования и rest synatx. Получите год и месяц с помощью String.match() регулярного выражения, добавьте их к остальной части объекта с расширением объекта:

 const data = [{"id":"1","yMonth":"201901"},{"id":"2","yMonth":"201902"},{"id":"3","yMonth":"201802"},{"id":"4","yMonth":"202003"}]

const result = data.map(({ yMonth, ...rest }) => {
  const [, year, month] = yMonth.match(/(d{4})(d{2})/)
  
  return {
    ...rest,
    year,
    month,
  };
})

console.log(result)  

Ответ №3:

Вы можете использовать функцию map , а внутри обработчика использовать функцию match для записи года и месяца.

 var data = [     {        "id":"1",            "yMonth":"201901",   },   {        "id":"2",            "yMonth":"201902",   },   {        "id":"3",            "yMonth":"201802",   },   {        "id":"4",            "yMonth":"202003",   }],
    result = data.map(({yMonth, ...attr}) => {
      var [year, month] = yMonth.match(/[0-9]{2,4}/g);  
      return {...attr, year, month};
    });

console.log(result);  
 .as-console-wrapper { max-height: 100% !important; top: 0; }  

Ответ №4:

Это работает для меня

 let index  = 2 //from where you want to split
data.map(d=>{
   d.month=d.yMonth.substring(0, index);
   d.year = d.yMonth.substring(index);
   delete yMonth;
  return d;
})