Salesforce LWC學習(二十四) Array.sort 淺談

zero.zhang發表於2020-09-08

本篇參考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

salesforce開發過程中,陣列在前端的使用中基本是不可避免,下面的demo大家猜一下輸出結果。

arraySortSample.html

<template>
    <lightning-card title="integer item sort">
        <ul>
            <template for:each={sortedIntegerArray} for:item="integerItem">
                <li key={integerItem}>
                    {integerItem}
                </li>
            </template>
        </ul>
    </lightning-card>
    <lightning-card title="string item sort">
        <ul>
            <template for:each={sortedStringArray} for:item="stringItem">
                <li key={stringItem}>
                    {stringItem}
                </li>
            </template>
        </ul>
    </lightning-card>
</template>

arraySortSample.js

import { LightningElement } from 'lwc';

export default class ArraySortSample extends LightningElement {

    integerArray = [2,5,23,4,16];

    stringArray = ['a','A','b','B'];

    get sortedIntegerArray() {
        return this.integerArray.sort();
    }

    get sortedStringArray() {
        return this.stringArray.sort();
    }
}

結果展示

 如果對前端不熟悉的人可能有點疑問。

1. 數字比較沒有按照常規的大小順序?

2. 字元排序沒有按照 abcd等順序?

 當我們檢視官方的API以後,可以發現:

1. sort比較第一件事先將每一個item轉換成字元,也就是說即使整型他也會先轉成字元;

2. 按照unicode位點進行排序。我們檢視ASC碼可以看出來A對應65,B對應66,a對應97,b對應98。 所以排序為 ABab。

顯然這種排序不符合我們的要求,如何進行自定義的排序?

 sort基於原地演算法,方法提供了一個可選擇的比較函式,可以提供兩個引數,這兩個引數相鄰的並對這兩個引數進行比較。我們只需要進行自定義的sort方法設定,通過比較a,b兩個引數是否大於0即可知道a/b兩個誰大然後array便會對兩個引數進行自定義排序。

 在lwc中,可以使用 array.sort((a,b) => {logic})方式去操作,a代表第一個item,b代表第二個item。logic返回大於0或者小於等於0即可。

我們對程式碼進行簡單的變換。

import { LightningElement } from 'lwc';

export default class ArraySortSample extends LightningElement {

    integerArray = [2,5,23,4,16];

    stringArray = ['a','A','b','B'];

    items = [
        { name: 'Edward', value: 21 },
        { name: 'Sharpe', value: 37 },
        { name: 'And', value: 45 },
        { name: 'The', value: -12 },
        { name: 'Magnetic' },
        { name: 'Zeros', value: 37 }
    ];

    get sortedItemArray() {
        return this.items.sort((a,b) => {
            return (a.value - b.value);
        });
    }

    get sortedIntegerArray() {
        return this.integerArray.sort((a,b) => a - b);
    }

    get sortedStringArray() {
        //return this.stringArray.sort();
        return this.stringArray.sort((a,b) => {
            a = a.toLocaleLowerCase();
            b = b.toLocaleLowerCase();
            if(a <= b) {
                return -1;
            } else {
                return 1;
            }
        });
    }
}

 對應的arraySortSample.html如下:

<template>
    <lightning-card title="integer item sort">
        <ul>
            <template for:each={sortedIntegerArray} for:item="integerItem">
                <li key={integerItem}>
                    {integerItem}
                </li>
            </template>
        </ul>
    </lightning-card>
    <lightning-card title="string item sort">
        <ul>
            <template for:each={sortedStringArray} for:item="stringItem">
                <li key={stringItem}>
                    {stringItem}
                </li>
            </template>
        </ul>
    </lightning-card>


    <lightning-card title="object item sort">
        <ul>
            <template for:each={sortedItemArray} for:item="objectItem">
                <li key={objectItem.value}>
                    {objectItem.name}
                </li>
            </template>
        </ul>
    </lightning-card>
</template>

結果展示

總結:篇中主要簡單介紹了一下如何進行自定義sort以及標準sort的排序標準。篇中錯誤地方歡迎指出,有不懂歡迎留言。

相關文章