如何按价值对产品进行排序?

How sort rendering of products by value?

我有对象数组 products 喜欢

[{name: 'apple', value: 100}, {name: 'watermelon', value: 200}, {name: 'orange', value: 50}],以及带有“最高价”和“最低价”选项的 select 输入,但它不起作用:

function ProductsPage() {
    const [products, setProducts] = useState([])

    useEffect(() => {/*here i setProducts([...]) array of objects which i get of backend*/})

    const orderShowing = (e) => {
        let actual_show = products
        let newOrder = e.target.value;
        if (newOrder === "High price") {
            actual_show.sort((a, b) => (b.value > a.value) ? 1 : (a.value > b.value) ? -1 : 0)
        } else if (newOrder === "Low price") {
            actual_show.sort((a, b) => (a.value > b.value) ? 1 : (b.value > a.value) ? -1 : 0)
        console.log(actual_show)
        setProducts(actual_show)
    }

    return (
        <div>
            <select id="productsOrder" onChange={orderShowing}>
                <option>High price</option>
                <option>Low price</option>
            </select>
            <h2>Products</h2>
            {products.map((p) => {
                return <p>{p.name}</p>})}
        </div>
    )
}

console.log 实际上是我想要的(排序有效),但页面不会用 'new' products 数组

刷新

尝试这样的事情:

products.sort(function (a, b) {
  return a.value - b.value;
});

请记住,此解决方案仅适用于数值。

我运行你的代码。当你映射它时,你只是忘记了 p.name 上的花括号 - 否则它将被视为一个字符串。应该是 {p.name}.

首先,您需要复制一份 state:

  let actual_show = [...products];

然后尝试像我正在使用的那样对其进行排序:

import { useEffect, useState } from "react";

export default function App() {
  const [products, setProducts] = useState([
    { name: "apple", value: 100 },
    { name: "watermelon", value: 200 },
    { name: "orange", value: 50 }
  ]);

  const orderShowing = (e) => {
    let actual_show = [...products];
    let newOrder = e.target.value;
    if (newOrder === "High price") {
      actual_show.sort((a, b) => a.value - b.value);
    } else if (newOrder === "Low price") {
      actual_show.sort((a, b) => b.value - a.value);
    }
    setProducts(actual_show);
  };

  return (
    <div>
      <select id="productsOrder" onChange={orderShowing}>
        <option>High price</option>
        <option>Low price</option>
      </select>
      <h2>Products</h2>
      {products.map((p) => {
        return <p>{p.name}</p>;
      })}
    </div>
  );
}

这是对现有代码进行最少更改的工作示例。 Run the code here

export default function App() {
  const [products, setProducts] = useState([]);

  useEffect(() => {
    setProducts([
      { name: 'apple', value: 100 },
      { name: 'watermelon', value: 200 },
      { name: 'orange', value: 50 }
    ]);
  }, []);

  const orderShowing = e => {
    let actual_show = products.slice(); //making a copy of products
    let newOrder = e.target.value;
    if (newOrder === 'High price') {
      actual_show.sort((a, b) =>
        b.value > a.value ? 1 : a.value > b.value ? -1 : 0
      );
    } else if (newOrder === 'Low price') {
      actual_show.sort((a, b) =>
        a.value > b.value ? 1 : b.value > a.value ? -1 : 0
      );
    }
    console.log(actual_show);
    setProducts(actual_show);
  };
  return (
    <div>
      <select id="productsOrder" onChange={orderShowing}>
        <option>High price</option>
        <option>Low price</option>
      </select>
      <h2>Products</h2>
      {products.map(p => {
        return <p>{p.name}</p>;
      })}
    </div>
  );
}