Как преобразовать массив в объект с разными ключами в первом и последнем элементах массива? - PullRequest
0 голосов
/ 19 июня 2020

Это то, что я пробовал до сих пор.

Что работает, за исключением того, что я не могу понять, как изменить первый и последний ключи даты?

 const dates: any = [
    '2020-06-24',
    '2020-06-25',
    '2020-06-26',
    '2020-06-27',
    '2020-06-28',
    '2020-06-29',
    '2020-06-30',
  ];

  const dateArrayToObject = () => {
    const dateObject = dates.reduce(
      (acc: string, date: string) =>
        Object.assign(acc, {
          [date]: { selected: true, marked: true },
        }),
      {}
    );

    return dateObject;
  };

Ответы [ 3 ]

2 голосов
/ 19 июня 2020

Думаю, это то, что вам нужно.

const dates = [
    '2020-06-24',
    '2020-06-25',
    '2020-06-26',
    '2020-06-27',
    '2020-06-28',
    '2020-06-29',
    '2020-06-30',
  ];

var res= dates.reduce((acc, v, index, arr)=>{
  if(index === 0){
    acc = [...acc, {[v] : {startingDay: true, marked: true}} ]
  }else if(index === arr.length-1){
    acc = [...acc, {[v] : {ending: true, marked: true}} ]
  }else{
    acc = [...acc, {[v] : {selected: true, marked: true}} ]
  }
  return acc
},[])
console.log(res)

ОБНОВЛЕНИЕ: если вы хотите сохранить результат как объект, а не массив, вы можете сделать это:

 const dates = [
        '2020-06-24',
        '2020-06-25',
        '2020-06-26',
        '2020-06-27',
        '2020-06-28',
        '2020-06-29',
        '2020-06-30',
      ];

    var res= dates.reduce((acc, v, index, arr)=>{
     
           acc = index === 0? {...acc, ...{[v] : {startingDay: true, marked: true}} }
              : index === arr.length-1 ? acc = {...acc, ...{[v] : {ending: true, marked: true}} }
              : acc = {...acc, ...{[v] : {selected: true, marked: true}} }
      return acc
    },{})
    console.log(res)
1 голос
/ 19 июня 2020

Используйте третий аргумент i (индекс) в методе уменьшения.

 const dates = [
    '2020-06-24',
    '2020-06-25',
    '2020-06-26',
    '2020-06-27',
    '2020-06-28',
    '2020-06-29',
    '2020-06-30',
  ];

  const dateArrayToObject = () => {
    const dateObject = dates.reduce(
      (acc, date, i) =>
        Object.assign(acc, {
          [date]: { selected: true, marked: true, 
            first: i === 0,
            last: i === dates.length - 1 
            },
        }),
      {}
    );

    return dateObject;
  };
  
  console.log(dateArrayToObject())
0 голосов
/ 20 июня 2020

с помощью операции map вы можете преобразовать каждый объект с помощью нескольких дополнительных свойств, например firstElement и lastElement, и сохранить остальные элементы, поскольку он возвращается с новым массивом объектов.

const dates = [
    '2020-06-24',
    '2020-06-25',
    '2020-06-26',
    '2020-06-27',
    '2020-06-28',
    '2020-06-29',
    '2020-06-30',
];

dates.map((value, index) => {
            const obj = {
                selected: true,
                marked: true
            };

            if (index == 0) {
                obj.firstElement = true;
                return obj;
            } 
            else if (index == dates.length - 1) {
                obj.lastElement = true;
                return obj;
            } 
            else {
                return obj;
            }
});
...