【问题标题】:Does sort alter my json array or does it return a sorted array排序会改变我的 json 数组还是返回排序后的数组
【发布时间】:2022-01-08 05:39:32
【问题描述】:

我正在尝试在我的表标题单击上对一个 json 数组进行排序。我正在尝试关注此网络article。我的函数运行但数组永远不会改变。这是函数:

function setInvoiceSortField(field) {
    console.log(field);
    let sortedInvoices = this.state.invoiceList;
    if (field !== null) {
        sortedInvoices.sort((a, b) => {
            console.log(`a ${a[field]}`);
            console.log(`b ${b[field]}`);
            if (a[field] < b[field]) {
                return -1;
            }
            if (a[field] > b[field]) {
                return 1;
            }
            return 0;
        });
        this.setState({ invoiceList: sortedInvoices });
    }
}

如果需要,我可以发布 json 数组和/或整个 .js 文件的示例。 .sort() 是在更改 sortedInvoices 还是返回一个排序数组?非常感谢任何提示或帮助!

更新

我添加了一个 if 来检查它们是否匹配帖子排序并且它们匹配。

function setInvoiceSortField(field) {
    console.log(field);
    let sortedInvoices = this.state.invoiceList;
    if (field !== null) {
        sortedInvoices.sort((a, b) => {
            console.log(`a ${a[field]}`);
            console.log(`b ${b[field]}`);
            if (a[field] < b[field]) {
                return -1;
            }
            if (a[field] > b[field]) {
                return 1;
            }
            return 0;
        });
        if (sortedInvoices === this.state.invoiceList) {
            console.log("matched")
        }
        this.setState({ invoiceList: sortedInvoices });
    }
}

【问题讨论】:

  • 也许(这是一个猜测)React 看到您在状态更新中的数组与已经存在的数组相同。

标签: javascript arrays reactjs sorting


【解决方案1】:

由于您直接将数组(this.state.invoiceList) 分配给 sortedInvoices,它将通过引用来完成。因此,即使您的数组(sortedInvoices)与 invoiceList 不同,两个引用也是相同的。因此不会反映更改。

function setInvoiceSortField(field) {
console.log(field);
let sortedInvoices = [...this.state.invoiceList];
if (field !== null) {
    sortedInvoices.sort((a, b) => {
        console.log(`a ${a[field]}`);
        console.log(`b ${b[field]}`);
        if (a[field] < b[field]) {
            return -1;
        }
        if (a[field] > b[field]) {
            return 1;
        }
        return 0;
    });
    this.setState({ invoiceList: sortedInvoices });
  }
}

【讨论】:

  • 你是绝对正确的。我犯了一个多么愚蠢的错误。
【解决方案2】:

来自MDN website

sort() 方法对数组的元素进行就地排序,并返回排序后的数组。示例已复制。

const months = ['March', 'Jan', 'Feb', 'Dec'];
months.sort();
console.log(months);
// expected output: Array ["Dec", "Feb", "Jan", "March"]

【讨论】:

  • 但这并不能解释为什么数组永远不会改变。
  • 这并没有解决我的问题,但它确实回答了我提出的问题。 +1
猜你喜欢
  • 1970-01-01
  • 2020-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-27
  • 1970-01-01
  • 2023-03-28
  • 2021-04-24
相关资源
最近更新 更多