Мои данные следующие
data=[
{
id: 1,
name: 'John Doe',
contacts: '[email protected]',
accepted: true
},
{
id: 2,
name: 'Jane Doe',
contacts: '[email protected]',
accepted: false
},
]
Я хочу фильтровать (если переменная filterKey не пуста /null) и сортировать (если переменная sortKey не пуста /null). Я могу сделать это с некоторыми if/then, но есть ли лучший способ?
let computedList = data
if(filterKey) {
computedList = data.filter(item => item.name.includes(filterKey))
}
if(sortKey) {
computedList = data.sort(...)
}
computedList.map(item => <div>item.name</div>)
Я могу сделать это с некоторыми if/then, но есть ли лучший способ?
Не на самом деле нет. Это самый чистый, самый ясный способ, на самом деле нет необходимости в альтернативе, если вы не работаете в определенных стилях программирования (например, в функциональном программировании), которые вам кажутся не такими. Но вы хотите использовать computedList
, а не data
, в инструкции sort
(в случае, если вы отфильтровали). И, конечно, вам нужно что-то сделать с возвращаемым значением map
.
Сторона примечания: sort
на месте, поэтому нет необходимости в назначении, и если вы не являетесь владельцем точек data
массива, вы можете сначала клонировать, если вы не фильтруете. Например:
let computedList = filterKey ? data.filter(item => item.name.includes(filterKey)) : data.slice();
if (sortKey) {
computedList.sort(/*...*/);
}
let result = computedList.map(item => <div>item.name</div>);
или, возможно,
let computedList = data;
if (filterKey) {
computedList = computedList.filter(item => item.name.includes(filterKey));
}
if (sortKey) {
if (!filterKey) {
computedList = computedList.slice();
}
computedList.sort(/*...*/);
}
let result = computedList.map(item => <div>item.name</div>);
... чтобы избежать копирования, если вам не нужно.
Ничего плохого в if/else
сейчас и потом. Однако вы можете "скрыть" состав if
functions:
const data = [
{id: 1, name: 'John Doe', contacts: '[email protected]', accepted: true},
{id: 2, name: 'Jane Doe', contacts: '[email protected]', accepted: false},
{id: 3, name: 'Jane J', contacts: '[email protected]', accepted: false}
];
const filter = (data, filterKey) => filterKey ? data.filter(item => item.name.includes(filterKey)) : data
const sort = (data, sortKey) => sortKey ? [...data].sort((a, b) => a[sortKey] > b[sortKey]) : data
const filterKey = 'Doe'
const sortKey = 'name'
const computedList = sort(filter(data, filterKey), sortKey)
// .map(item => <div>item.name</div>) // removed for the demo
console.log(computedList);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
filterKey
иsortKey
?filterKey
иfilterKey
иsortKey
, оно всегда сортируетdata
не результат фильтра.