Из-за того, что я новичок в реакции и js, мне трудно правильно построить массив, Я нашел статью в Интернете, согласно которой с помощью метода concat можно создать массив. Я следовал той же технике, Но моя проблема в том, что он добавляет данные и сравнивает их, если те же данные уже есть. Я хочу сравнить данные перед добавлением в массив, чтобы в массив не попали повторяющиеся данные.
Мой текущий код:
const [input, setInput] = useState([]) // state
const handleOnChange = (userInput) => {
// Add the userInput the list onChange of userInput
// Save userInput to React Hooks
setInput((input) => input.concat(userInput))
console.info(input)
}
Здесь userInput и объект с несколькими строковыми значениями, такими как
{id: 1 , ifYes: "Do this", ifNo : "Do something else"}
и если в массиве есть элемент с идентификатором: 1, то повторное нажатие не должно добавляться в массив.
Вы можете использовать массив find
, чтобы проверить, есть ли в массиве объект с таким же идентификатором, а если нет, то вы можете добавить значение
const [input, setInput] = useState([]) // state
const handleOnChange = (userInput) => {
// Add the userInput the list onChange of userInput
// Save userInput to React Hooks
const hasUserInput = input.find(userVal => userVal.id === userInput.id);
if (!hasUserInput) {
setInput((input) => input.concat(userInput));
console.info(input)
}
}
Вы можете проверить, содержит ли массив элемент с идентификатором с помощью some(...)
.
const [input, setInput] = useState([]) // state
const handleOnChange = (userInput) => {
// Add the userInput the list onChange of userInput
// Save userInput to React Hooks
if (!input.some(i => i.id === userInput.id)){
setInput((input) => input.concat(userInput))
}
console.info(input)
}
ваш ответ будет правильным. Но никогда не выполняйте функцию в условном выражении
if
. Причина в том, что вы не сможете проверить значение, когда поставите отладчик, а также модульное тестирование этого кода будет сложным.