#javascript #reactjs #sorting #react-props
#javascript #reactjs #сортировка #react-props
Вопрос:
У меня есть массив с именем products, который использует метод map для перечисления всех элементов внутри него, и я пытаюсь отсортировать эти элементы по реквизиту price. Я перепробовал все типы методов и функций сортировки, но не могу заставить его работать.
JS
const recentprods = products.map(prod => {
return <TableRow name={prod.name} price={prod.price} />
})
Я пытался:
const recentprods = products.map(prod => {
return <TableRow name={prod.name} price={prod.price} />
}).sort((a,b) => a.price < b.price)
и
recentprods.sort()
По сути, как можно сортировать компонент react по его реквизитам?
Ответ №1:
Вы должны применить сортировку перед отображением.
const recentprods = products
.sort((a,b) => a.price - b.price)
// if you want to change the sorting direction: b.price - a.price
.map(prod => {
return <TableRow name={prod.name} price={prod.price} />
});
Комментарии:
1. Если я применяю сортировку до или после map, я не могу получить доступ к prod.price, prod.name , и т.д. Как бы мне это сделать тогда?
2. Должен ли я сделать другую карту поверх метода сортировки?
3. @Uriel Почему вы не можете получить доступ
price
к andname
? Они доступны внутри области действия функции map. Просто скопируйте и вставьте мой код.4. @Uriel только что обновил мой ответ, вероятно
>
, проблема была в знаке gt. Операция минус должна отсортировать его.5. Метод сортировки должен возвращать число, а не логическое значение, как показано в моем ответе. : D
Ответ №2:
Итак, да, в основном вам нужно сначала отсортировать его, а затем сопоставить, я создал для вас пример:
constructor(props) {
super(props);
this.state = {
products: [
{ name: 'Product 2', price: 2 },
{ name: 'Product 6', price: 6 },
{ name: 'Product 1', price: 1 },
{ name: 'Product 3', price: 3 },
{ name: 'Product 7', price: 7 },
{ name: 'Product 4', price: 4 },
{ name: 'Product 8', price: 8 },
{ name: 'Product 5', price: 5 },
],
};
}
render() {
return (
<div>
<h1>ONLY MAPPED</h1>
{this.state.products.map((prod, i) => {
return (
<li key={i}>
{prod.name} and its price: {prod.price}
</li>
);
})}
<h1>BOTH SORTED AND MAPPED.</h1>
{this.state.products
.sort((first, second) => {
return first.price > second.price ? 1 : -1;
})
.map((prod, i) => {
return (
<li key={i}>
{prod.name} and its price: {prod.price}
</li>
);
})}
</div>
);
}
Ответ №3:
Вы хотите нормализовать, отсортировать и иным образом изменить свои данные по своему усмотрению, прежде чем применять их к компонентам React. В следующем случае products
массив содержит отдельные объекты, каждый со price
свойством, поэтому products
предварительно отсортируйте массив, а затем сопоставьте элементы.
.sort
Метод сортирует элементы массива на месте и возвращает отсортированный массив. Метод chained .map
будет выполнять итерацию по отсортированному массиву в установленном порядке.
Я считаю, что следующее является допустимым решением. Обратите внимание, что цена рассматривается как number
. Если это не так, сортировка может работать некорректно.
const recentprods = products
.sort((a, b) => a.price - b.price)
.map(item => <TableRow name={item.name} price={item.price} />);
Ответ №4:
рассмотрим, что у нас есть массив объектов со свойствами name и price.
const Products = [
{name:"p1",price: 5},
{name:"p2",price: 3},
{name:"p3",price: 2},
{name:"p4",price: 7},
]
Нам нужно отсортировать массив Products в порядке возрастания, используя его свойство price .
console.log(Products.sort((a,b) => a.price-b.price )); // descending b.price-a.price
output - >
[
{name: "p3", price: 2},
{name: "p2", price: 3},
{name: "p1", price: 5},
{name: "p4", price: 7}
]
Теперь вы можете вызвать функцию map с элементом jsx, который хотите добавить
Products.sort((a,b) => a.price-b.price ).map(data => {
return <TableRow name={prod.name} price={prod.price} />;
});
PS: ВЫ можете использовать эту функцию непосредственно в своем коде или использовать вспомогательную функцию, чтобы убедиться, что она отсортирована jsx.