Skip to content

How to concat the object is useState array?

I have the useState varible. I want to concat the value with new object.

const [dates,setDates] = useState(["Mon","Sun"])

rules: 1.If the date exist with isSelected flag then make as false

[{day:"mon",isSelected:false}]

otherwise, make as,

[{day:"mon",isSelected:true}]

my function below,

const handleDay = (day) => {
  setDates((x) => {
    x.map((v) => {
      if (day === v.day && v.isSelected) {
        v.isSelected = true;
        return {
          v,
        };
      } else {
        return {
          day,
          isSelected: true,
        };
      }
    });
  });
};

handleDay('mon');

expected output

[{day:"mon",isSelected:true}, 'Sun']

but I got this,

 [{
    "day": "Mon",
    "isSelected": true
 }, {
    "day": "Mon",
    "isSelected": true
 }]

Answer

Replace your map code with this

arr.map(v => {
  if (day === v.day || day === v) {
    return {
      day: v.day ? v.day : v,
      isSelected: !v.isSelected
    };
  } else {
    return v
  }
});

let arr = ["Mon", "Sun"]

const handleDay = day => {
  let arr2 =  
    arr.map(v => {
      if (day === v.day || day === v) {
        return {
          day: v.day ? v.day : v,
          isSelected: !v.isSelected
        };
      } else {
        return v
      }
    });
    
    return arr2;
};

console.log(handleDay('Mon'));
arr = handleDay('Mon');
console.log(handleDay('Mon'));