Пытаюсь отсортировать массив объектов по одному из полей используя функцию localeCompare
Я имею компонент App, в котором есть классический список дел и сортировка через выпадающий список. Когда я в компоненте MySelect выбираю параметры сравнения срабатывает функция sortPosts, которая сортирует массив объектов posts. Так как сравнивать приходится строки я использовал функцию localeCompae. И у меня возникает ошибка TypeError: a[sort].localeСompare is not a function
Компонент App
import './styles/App.css'
import PostList from './components/PostList'
import PostForm from "./components/PostForm"
import MySelect from './components/UI/select/MySelect'
function App() {
const [posts, setPosts] = useState([
{ id: 1, title: 'аа', body: 'вв' },
{ id: 2, title: 'гг', body: 'ее' },
{ id: 3, title: 'бб', body: 'сс' }
])
const [selectedSort, setSelectedSort] = useState('')
const createPost = (newPost) => {
setPosts([...posts, newPost])
}
const removepost = (post) => {
setPosts(posts.filter(p => p.id !== post.id))
}
const sortPosts = (sort) => {
setSelectedSort(sort)
// console.log([...posts].map(item => console.log(typeof(item[sort]))))
setPosts([...posts].sort((a,b) => a[sort].localeСompare(b[sort])))
}
return (
<div className="App">
<PostForm create={createPost} />
<hr style={{ margin: "15px 0" }} />
<div>
<MySelect
value={selectedSort}
onChange={sortPosts}
defaultValue='Сортировка по'
options={[
{ value: 'title', name: 'По названию' },
{ value: 'body', name: 'По описанию' }
]}
/>
</div>
{posts.length
?
<PostList remove={removepost} posts={posts} title='Посты про JS' />
:
<h1 style={{ textAlign: "center" }}>Посты не найдены</h1>
}
</div>
);
}
export default App
Компонент Myselect
import React from 'react'
const MySelect = ({options, defaultValue, value, onChange}) => {
return (
<select
value={value}
onChange={event => onChange(event.target.value)}
>
<option disabled value="">{defaultValue}</option>
{options.map(option =>
<option key={option.value} value={option.value}>
{option.name}
</option>
)}
</select>
)
}
export default MySelect
Ответы (1 шт):
Автор решения: user483692
→ Ссылка
setPosts([...posts].sort((a,b) => a[sort].localeCompare(b[sort]))) У меня была ошибка в том, что я не указал скобку открывающую перед (a,b) Поэтому пишите правильно