Reputation: 2317
I want to insert a string value inside an array with 3 string values randomly. But it gives this error in console:
*Uncaught TypeError: can't define array index property past the end of an array with non-writable length*
After assigning obj.incorrect_answers
to answers
, the length of the array will be 3, and I try to insert correct_answer
(that is a string) in an index between 0 to 3.
It's desired part of my code:
export const Home = () => {
const [id, setId] = useState(0);
const dispatch = useDispatch();
const obj = useSelector((state) => state.questions.data[id]);
const fetchStatus = useSelector((state) => state.questions.status);
if(obj){
let answers = obj.incorrect_answers;
answers.splice(Math.floor(Math.random()*4), 0, obj.correct_answer);
console.log(answers);
}
useEffect(() => {
if(fetchStatus === "idle"){
dispatch(fetchQuestions());
}
}, [fetchStatus])
obj
is received from the server, but I know it's received correctly because when I console.log obj.incorrect_answers
it gives me an array from 3 strings and when I console.log obj.correct_answer
it gives me a string, correctly. So I think I just have a problem with splice
method.
Maybe, it is relevant to receive data from the server, but I can see received data in the console...
Upvotes: 2
Views: 673
Reputation: 2317
It fixed by slice()
Only by changing:
let answers = obj.incorrect_answers;
to:
let answers = obj.incorrect_answers.slice();
Upvotes: 0
Reputation: 774
Judging by the error message, it seems you have a read-only length
prop on your array! try to make it writable: Object.defineProperty(answers, 'length', { writable: true });
An alternative way of getting the same result is to insert to the end of the array, then simply shuffle the array.
if(obj){
let answers = obj.incorrect_answers;
answers.push(obj.correct_answer)
answers.sort(() => Math.random() - 0.5)
console.log(answers);
}
Upvotes: 1