#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;
})