У меня есть 2 входа для фильтрации arrProd (см. Код ниже). В функции FormSubmit я сначала проверяю, являются ли значения price.minPrice и price.maxPrice действительными числами, а не пустыми строками. После этих проверок могут быть только две опции: либо пользователь пишет и вводит цифры, либо оставляет поля пустыми. Затем я проверяю, начались ли числа, затем массив фильтруется. В цикле фильтрации бессмысленно проверять значение несколько раз. Как я могу сделать это, чтобы проверить это только один раз?
import React, { Fragment, useCallback, useState } from "react";
import ReactDOM from "react-dom";
const arrProd = [
{
price: "5.75",
sold: "100"
},
{
price: "2.36",
sold: "15"
},
{
price: "5.48",
sold: "20"
},
{
price: "4.49",
sold: "200"
},
{
price: "3.15",
sold: "258"
},
{
price: "9.99",
sold: "479"
},
{
price: "4.8",
sold: "147"
},
{
price: "8",
sold: "951"
},
{
price: "4.27",
sold: "753"
},
{
price: "2.46",
sold: "852"
},
{
price: "4.99",
sold: "742"
},
{
price: "3.49",
sold: "10"
},
{
price: "2",
sold: "26"
},
{
price: "3.83",
sold: "39"
},
{
price: "9.98",
sold: "47"
},
{
price: "6.77",
sold: "96"
}
];
function App() {
const [price, setPrice] = useState({ maxPrice: "", minPrice: "" });
const [sold, setSold] = useState("");
const [processingProd, setProcessingProd] = useState([]);
const [checkInput, setCheckInput] = useState({
checkPrice: false,
checkSold: false
});
const PriceMaxMin = useCallback(({ target: { value, name } }) => {
name === "maxPrice"
? setPrice(({ minPrice }) => ({ maxPrice: value, minPrice }))
: setPrice(({ maxPrice }) => ({ minPrice: value, maxPrice }));
}, []);
console.log(processingProd);
const FormSubmit = event => {
if (checkInput.checkPrice) setCheckInput({ checkPrice: false });
const checkPrice =
price.minPrice === "" && price.minPrice === ""
? "initial values"
: +price.maxPrice >= +price.minPrice &&
price.minPrice !== "" &&
!Number.isNaN(+price.maxPrice) &&
!Number.isNaN(+price.minPrice);
const checkSold = sold === "" ? "initial values" : !Number.isNaN(+sold);
if (!checkPrice || !checkSold) {
setCheckInput({ checkPrice: !checkPrice, checkSold: !checkSold });
return false;
}
const x = arrProd.filter(prod => {
const filterPrice =
checkPrice === "initial values"
? true
: +prod.price > +price.minPrice && +prod.price < +price.maxPrice;
const filterSold =
checkSold === "initial values" ? true : +sold >= +prod.sold;
return filterPrice && filterSold;
});
setProcessingProd(x);
event.preventDefault();
};
return (
<Fragment>
<form onSubmit={FormSubmit}>
{checkInput.checkPrice && (
<div>{"Please provide a valid price range"}</div>
)}
{"Min"}
<input
type={"text"}
name={"minPrice"}
size={6}
maxLength={10}
value={price.minPrice}
onChange={PriceMaxMin}
/>
{"Max"}
<input
type={"text"}
name={"maxPrice"}
size={6}
maxLength={10}
value={price.maxPrice}
onChange={PriceMaxMin}
/>
{checkInput.checkSold && (
<div>{"Please provide a valid price range"}</div>
)}
{"Sold"}
<input
type={"text"}
name={"minPrice"}
size={6}
maxLength={10}
value={sold}
onChange={({ target: { value, name } }) => setSold(value)}
/>
<input type="submit" title={"Submit price range"} value={"Go"} />
</form>
</Fragment>
);
}
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);