【问题标题】:Sort Proxy Array of Objects, localeCompare is not a function对对象的代理数组进行排序,localeCompare 不是函数
【发布时间】:2021-11-13 00:22:03
【问题描述】:

尝试使用 ES6 arrayObj.sort(a,b) => a.property.localeCompare(b.property) 语法但出现错误:

TypeError: a.property.localeCompare 不是函数。

我在想localeCompare 不在范围内但不明白如何将其绑定到排序范围,可能是因为数据存储在代理中?我也在 VueJS 3 中工作,但认为这与这个问题无关。

myData = 
Proxy {0: {…}, 1: {…}, 2: {…}, 3: {…}, 4: {…}}
[[Handler]]: Object
[[Target]]: Array(5)
0: {itemIndex: 1, itemFmt: 2, itemFmtName: 'Call To Order', guid: 'd66af412-00a0-4c49-b8b5-abaefb79fed0', maxCt: 1, …}
1: {itemIndex: 2, itemFmt: 6, itemFmtName: 'Title/Discussion/Motion', guid: '9f7b9d34-3fcb-42c7-866e-a56f71a8aa4f', maxCt: 0, …}
2: {itemIndex: 4, itemFmt: 6, itemFmtName: 'Title/Discussion/Motion', guid: '406bea5e-1cb0-4d90-96e9-9b80b64ff8ba', maxCt: 0, …}
3: {itemIndex: 5, itemFmt: 6, itemFmtName: 'Title/Discussion/Motion', guid: 'ad9aacda-5100-4eef-9ead-c61e1ec0c285', maxCt: 0, …}
4: {itemIndex: 7, itemFmt: 3, itemFmtName: 'Roll Call', guid: '1715f7a3-066d-4787-8233-a36df2a729a9', maxCt: 1, …}

myData.sort((a, b) => a.itemIndex.localeCompare(b.itemIndex))

【问题讨论】:

    标签: javascript vue.js sorting vuejs3 arrayobject


    【解决方案1】:

    localeComparemethod of String,但 a.itemIndexNumber,因此该方法在该属性上不可用。

    要按itemIndex 排序,请对两个Numbers 使用减法:

    const myData = [
      {itemIndex: 1, itemFmt: 2, itemFmtName: 'Call To Order', guid: 'd66af412-00a0-4c49-b8b5-abaefb79fed0', maxCt: 1 },
      {itemIndex: 2, itemFmt: 6, itemFmtName: 'Title/Discussion/Motion', guid: '9f7b9d34-3fcb-42c7-866e-a56f71a8aa4f', maxCt: 0},
      {itemIndex: 4, itemFmt: 6, itemFmtName: 'Title/Discussion/Motion', guid: '406bea5e-1cb0-4d90-96e9-9b80b64ff8ba', maxCt: 0},
      {itemIndex: 5, itemFmt: 6, itemFmtName: 'Title/Discussion/Motion', guid: 'ad9aacda-5100-4eef-9ead-c61e1ec0c285', maxCt: 0},
      {itemIndex: 7, itemFmt: 3, itemFmtName: 'Roll Call', guid: '1715f7a3-066d-4787-8233-a36df2a729a9', maxCt: 1},
    ]
    
    // sort by itemIndex in ascending order
    myData.sort((a,b) => a.itemIndex - b.itemIndex)
    
    console.log(myData)

    要按itemFmtName 排序,请在两个Strings 上使用localeCompare

    const myData = [
      {itemIndex: 1, itemFmt: 2, itemFmtName: 'Call To Order', guid: 'd66af412-00a0-4c49-b8b5-abaefb79fed0', maxCt: 1 },
      {itemIndex: 2, itemFmt: 6, itemFmtName: 'Title/Discussion/Motion', guid: '9f7b9d34-3fcb-42c7-866e-a56f71a8aa4f', maxCt: 0},
      {itemIndex: 4, itemFmt: 6, itemFmtName: 'Title/Discussion/Motion', guid: '406bea5e-1cb0-4d90-96e9-9b80b64ff8ba', maxCt: 0},
      {itemIndex: 5, itemFmt: 6, itemFmtName: 'Title/Discussion/Motion', guid: 'ad9aacda-5100-4eef-9ead-c61e1ec0c285', maxCt: 0},
      {itemIndex: 7, itemFmt: 3, itemFmtName: 'Roll Call', guid: '1715f7a3-066d-4787-8233-a36df2a729a9', maxCt: 1},
    ]
    
    // sort by itemFmtName in alphabetical order
    myData.sort((a,b) => a.itemFmtName.localeCompare(b.itemFmtName))
    
    console.log(myData)

    【讨论】:

      猜你喜欢
      • 2015-12-30
      • 2011-12-31
      • 1970-01-01
      • 2011-08-18
      • 2020-09-20
      相关资源
      最近更新 更多