欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScripts數(shù)組里的對象排序的24個方法(最新整理收藏)

 更新時間:2025年01月15日 11:05:42   作者:BIBOR  
文章介紹了24種在JavaScript中對數(shù)組進行排序的方法,每種方法都有具體的示例和應用場景,適合不同情況下的排序需求,感興趣的朋友跟隨小編一起看看吧

1. 使用 Array.prototype.sort()

這是最基本、也是最常用的方法。sort() 方法會原地修改數(shù)組,并返回排序后的數(shù)組。你需要傳入一個比較函數(shù)來定義排序邏輯。

const array = [
    { name: 'Alice', age: 25 },
    { name: 'Bob', age: 22 },
    { name: 'Charlie', age: 30 }
];
// 按照年齡升序排序
array.sort((a, b) => a.age - b.age);
console.log(array);
// 按照名字字母順序排序
array.sort((a, b) => a.name.localeCompare(b.name));
console.log(array);

2. 使用 Array.prototype.map() 和 Array.prototype.sort()

這種方法適用于當你不想改變原始數(shù)組時,可以先創(chuàng)建一個新的數(shù)組,然后進行排序。

const array = [
    { name: 'Alice', age: 25 },
    { name: 'Bob', age: 22 },
    { name: 'Charlie', age: 30 }
];
const sortedArray = array
    .map(item => item) // 復制數(shù)組
    .sort((a, b) => a.age - b.age);
console.log(sortedArray);
console.log(array); // 原數(shù)組未改變

3. 使用 Array.prototype.slice() 和 Array.prototype.sort()

同樣是為了不改變原數(shù)組,這種方法利用 slice() 創(chuàng)建一個數(shù)組的淺拷貝,然后進行排序。

const array = [
    { name: 'Alice', age: 25 },
    { name: 'Bob', age: 22 },
    { name: 'Charlie', age: 30 }
];
const sortedArray = array.slice().sort((a, b) => a.age - b.age);
console.log(sortedArray);
console.log(array); // 原數(shù)組未改變

4. 使用 Array.prototype.reduce() 實現(xiàn)自定義排序

如果你需要對數(shù)組進行復雜的排序操作,可以使用 reduce() 方法。

const array = [
    { name: 'Alice', age: 25 },
    { name: 'Bob', age: 22 },
    { name: 'Charlie', age: 30 }
];
const sortedArray = array.reduce((accumulator, currentValue) => {
    let i = 0;
    while (i < accumulator.length && accumulator[i].age < currentValue.age) {
        i++;
    }
    accumulator.splice(i, 0, currentValue);
    return accumulator;
}, []);
console.log(sortedArray);

5. 使用第三方庫(如 Lodash)

Lodash 提供了更強大的排序功能,如多屬性排序。你需要先安裝 Lodash:

npm install lodash

然后使用 Lodash 的 _.orderBy 方法:

const _ = require('lodash');
const array = [
    { name: 'Alice', age: 25 },
    { name: 'Bob', age: 22 },
    { name: 'Charlie', age: 30 }
];
// 按照多個屬性排序
const sortedArray = _.orderBy(array, ['age', 'name'], ['asc', 'asc']);
console.log(sortedArray);

6. 使用自定義比較函數(shù)進行多字段排序

如果你希望根據(jù)多個字段進行排序,可以編寫自定義的比較函數(shù)。

const array = [
    { name: 'Alice', age: 25, height: 165 },
    { name: 'Bob', age: 22, height: 175 },
    { name: 'Charlie', age: 22, height: 170 }
];
// 按年齡升序,如果年齡相同按身高降序
array.sort((a, b) => {
    if (a.age !== b.age) {
        return a.age - b.age; // 年齡升序
    } else {
        return b.height - a.height; // 年齡相同,身高降序
    }
});
console.log(array);

7. 使用穩(wěn)定排序庫(如 array-stable)

在某些情況下,你可能需要一個穩(wěn)定的排序算法。JavaScript 的原生 sort() 方法在不同瀏覽器上可能不是穩(wěn)定的??梢允褂?array-stable 庫來確保穩(wěn)定排序。

安裝該庫:

npm install array-stable

使用示例:

const stable = require('array-stable'); // 導入穩(wěn)定排序庫
const array = [
    { name: 'Alice', age: 25 },
    { name: 'Bob', age: 22 },
    { name: 'Charlie', age: 30 }
];
stable.sort(array, (a, b) => a.age - b.age); // 按年齡升序穩(wěn)定排序
console.log(array);

8. 使用 Intl.Collator 進行本地化排序

對于字符串排序,特別是涉及到國際化時,可以使用 Intl.Collator 來處理。

const array = [
    { name: 'éclair', age: 25 },
    { name: 'Alice', age: 22 },
    { name: 'Bob', age: 30 }
];
const collator = new Intl.Collator('fr', { sensitivity: 'base' }); // 創(chuàng)建法語語言環(huán)境的排序器
array.sort((a, b) => collator.compare(a.name, b.name)); // 按名稱排序
console.log(array);

9. 使用 Proxy 對象包裝數(shù)組

如果你希望在數(shù)組排序前后做一些額外操作,可以使用 Proxy 對象。

const array = [
    { name: 'Alice', age: 25 },
    { name: 'Bob', age: 22 },
    { name: 'Charlie', age: 30 }
];
const handler = {
    set(target, property, value) {
        console.log(`Setting value ${value} on property ${property}`);
        target[property] = value;
        return true;
    }
};
const proxyArray = new Proxy(array, handler); // 使用 Proxy 包裝數(shù)組
proxyArray.sort((a, b) => a.age - b.age); // 對代理數(shù)組進行排序
console.log(proxyArray);

10. 使用 TypedArray 進行數(shù)值排序

如果數(shù)組中的對象包含大量數(shù)值,并且排序性能非常關鍵,可以考慮將數(shù)值提取到 TypedArray 中進行排序,然后映射回原數(shù)組。

const array = [
    { name: 'Alice', age: 25 },
    { name: 'Bob', age: 22 },
    { name: 'Charlie', age: 30 }
];
const ages = new Uint8Array(array.map(item => item.age)); // 提取年齡到 Uint8Array 中
const sortedIndices = Array.from(ages)
    .map((age, index) => ({ age, index }))
    .sort((a, b) => a.age - b.age)
    .map(item => item.index);
const sortedArray = sortedIndices.map(index => array[index]); // 根據(jù)排序后的索引重構數(shù)組
console.log(sortedArray);

11. 按照對象屬性值的字符串長度排序

const array = [
    { name: 'Alice', description: 'A short description' },
    { name: 'Bob', description: 'A very long and detailed description' },
    { name: 'Charlie', description: 'Medium description' }
];
// 按描述的長度升序排列
array.sort((a, b) => a.description.length - b.description.length);
console.log(array);

12. 按照日期字段進行排序

const array = [
    { event: 'Event 1', date: new Date('2023-05-01') },
    { event: 'Event 2', date: new Date('2022-08-15') },
    { event: 'Event 3', date: new Date('2024-01-10') }
];
// 按日期升序排列
array.sort((a, b) => a.date - b.date);
console.log(array);

13. 使用 reduce 和 Object.entries 對對象數(shù)組進行排序

const array = [
    { name: 'Alice', age: 25 },
    { name: 'Bob', age: 22 },
    { name: 'Charlie', age: 30 }
];
// 使用 reduce 和 Object.entries 對對象數(shù)組按年齡升序排序
const sortedArray = Object.values(array.reduce((acc, obj) => {
    acc[obj.age] = obj;
    return acc;
}, {}));
console.log(sortedArray);

14. 按照多個條件進行復雜排序

const array = [
    { name: 'Alice', age: 25, height: 165 },
    { name: 'Bob', age: 22, height: 175 },
    { name: 'Charlie', age: 22, height: 170 },
    { name: 'David', age: 22, height: 175 }
];
// 按年齡升序,如果年齡相同,再按身高降序,如果年齡和身高都相同,再按姓名字母升序
array.sort((a, b) => {
    if (a.age !== b.age) {
        return a.age - b.age; // 年齡升序
    } else if (a.height !== b.height) {
        return b.height - a.height; // 身高降序
    } else {
        return a.name.localeCompare(b.name); // 姓名字母升序
    }
});
console.log(array);

15. 基于對象某一屬性的數(shù)值范圍排序

const array = [
    { name: 'Alice', score: 85 },
    { name: 'Bob', score: 75 },
    { name: 'Charlie', score: 95 },
    { name: 'David', score: 80 }
];
// 按分數(shù)區(qū)間排序:低于80分、80到90分之間、大于90分
array.sort((a, b) => {
    if (a.score < 80 && b.score >= 80) {
        return -1; // a 在 b 之前
    } else if (a.score >= 80 && a.score <= 90 && (b.score < 80 || b.score > 90)) {
        return -1; // a 在 b 之前
    } else if (a.score > 90 && b.score <= 90) {
        return 1; // a 在 b 之后
    } else {
        return 0;
    }
});
console.log(array);

16. 使用 Map 進行自定義鍵排序

const array = [
    { name: 'Alice', priority: 'medium' },
    { name: 'Bob', priority: 'low' },
    { name: 'Charlie', priority: 'high' },
    { name: 'David', priority: 'medium' }
];
const priorityOrder = new Map([
    ['low', 1],
    ['medium', 2],
    ['high', 3]
]);
// 按優(yōu)先級排序
array.sort((a, b) => priorityOrder.get(a.priority) - priorityOrder.get(b.priority));
console.log(array);

17. 按照嵌套對象屬性排序

const array = [
    { id: 1, details: { age: 25 } },
    { id: 2, details: { age: 30 } },
    { id: 3, details: { age: 20 } }
];
// 按嵌套對象的年齡屬性升序排序
array.sort((a, b) => a.details.age - b.details.age);
console.log(array);

18. 按照字符串中的數(shù)字進行排序

const array = ['item20', 'item5', 'item12', 'item1'];
// 按字符串中的數(shù)字部分進行升序排序
array.sort((a, b) => {
    const numA = parseInt(a.replace(/\D/g, ''));
    const numB = parseInt(b.replace(/\D/g, ''));
    return numA - numB;
});
console.log(array);

19. 按照布爾值進行排序

const array = [
    { name: 'Alice', isActive: true },
    { name: 'Bob', isActive: false },
    { name: 'Charlie', isActive: true },
    { name: 'David', isActive: false }
];
// 按布爾值排序,false 在前,true 在后
array.sort((a, b) => a.isActive - b.isActive);
console.log(array);

20. 按照多個對象數(shù)組的屬性組合排序

const array = [
    { firstName: 'Alice', lastName: 'Smith' },
    { firstName: 'Bob', lastName: 'Brown' },
    { firstName: 'Charlie', lastName: 'Smith' },
    { firstName: 'David', lastName: 'Johnson' }
];
// 先按姓氏排序,如果姓氏相同,再按名字排序
array.sort((a, b) => {
    if (a.lastName !== b.lastName) {
        return a.lastName.localeCompare(b.lastName); // 按姓氏排序
    } else {
        return a.firstName.localeCompare(b.firstName); // 按名字排序
    }
});
console.log(array);

21. 基于自定義權重排序

const array = [
    { name: 'Alice', role: 'user' },
    { name: 'Bob', role: 'admin' },
    { name: 'Charlie', role: 'guest' },
    { name: 'David', role: 'user' }
];
const roleWeights = {
    'guest': 1,
    'user': 2,
    'admin': 3
};
// 按角色權重排序
array.sort((a, b) => roleWeights[a.role] - roleWeights[b.role]);
console.log(array);

22. 按照隨機順序排序

const array = [1, 2, 3, 4, 5];
// 使用 Math.random() 將數(shù)組隨機打亂
array.sort(() => Math.random() - 0.5);
console.log(array);

23. 按照數(shù)組中對象的多個數(shù)值屬性排序

const array = [
    { name: 'Alice', score1: 90, score2: 85 },
    { name: 'Bob', score1: 85, score2: 95 },
    { name: 'Charlie', score1: 80, score2: 75 },
    { name: 'David', score1: 90, score2: 80 }
];
// 先按 score1 排序,如果 score1 相同,再按 score2 排序
array.sort((a, b) => {
    if (a.score1 !== b.score1) {
        return a.score1 - b.score1; // 按 score1 排序
    } else {
        return a.score2 - b.score2; // 按 score2 排序
    }
});
console.log(array);

24. 按照對象屬性的存在性排序

const array = [
    { name: 'Alice', age: 25 },
    { name: 'Bob' },
    { name: 'Charlie', age: 30 },
    { name: 'David' }
];
// 有 age 屬性的對象在前,沒有的在后
array.sort((a, b) => ('age' in a ? -1 : 1) - ('age' in b ? -1 : 1));
console.log(array);

到此這篇關于JavaScripts數(shù)組里的對象排序的24個方法的文章就介紹到這了,更多相關js數(shù)組對象排序內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • JS中typeof與instanceof之間的區(qū)別總結

    JS中typeof與instanceof之間的區(qū)別總結

    本文是對JS中typeof與instanceof之間的區(qū)別進行了詳細的總結介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-11-11
  • js實現(xiàn)仿MSN帶關閉功能的右下角彈窗代碼

    js實現(xiàn)仿MSN帶關閉功能的右下角彈窗代碼

    這篇文章主要介紹了js實現(xiàn)仿MSN帶關閉功能的右下角彈窗代碼,涉及javascript操作頁面元素的布局及屬性的動態(tài)變換技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09
  • 小程序實現(xiàn)手寫簽名

    小程序實現(xiàn)手寫簽名

    這篇文章主要為大家詳細介紹了小程序實現(xiàn)手寫簽名,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • JavaScript實現(xiàn)淘寶京東6位數(shù)字支付密碼效果

    JavaScript實現(xiàn)淘寶京東6位數(shù)字支付密碼效果

    這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)淘寶京東6位數(shù)字支付密碼效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • JS動態(tài)添加元素及綁定事件造成程序重復執(zhí)行解決

    JS動態(tài)添加元素及綁定事件造成程序重復執(zhí)行解決

    這篇文章主要給大家介紹了關于JS動態(tài)添加元素及綁定事件造成程序重復執(zhí)行的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
    2017-12-12
  • js實現(xiàn)帶進度條提示的多視頻上傳功能

    js實現(xiàn)帶進度條提示的多視頻上傳功能

    這篇文章主要為大家詳細介紹了js實現(xiàn)帶進度條提示的多視頻上傳功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • 當前流行的JavaScript代碼風格指南

    當前流行的JavaScript代碼風格指南

    這篇文章主要介紹了當前流行的JavaScript代碼風格指南,同時推薦了一款風格檢驗工具jshint,可以配合大多數(shù)的編輯器統(tǒng)一團隊代碼風格,需要的朋友可以參考下
    2014-09-09
  • 原生JavaScript編寫俄羅斯方塊

    原生JavaScript編寫俄羅斯方塊

    本文給大家分享的是使用原生javascript實現(xiàn)的俄羅斯方塊的代碼,還沒有很完善,這里放出來,算是拋磚引玉吧,希望小伙伴們能夠喜歡。
    2015-03-03
  • Js中FileReader讀取文件內容方法詳解(async/await)

    Js中FileReader讀取文件內容方法詳解(async/await)

    這篇文章主要給大家介紹了關于Js中FileReader讀取文件內容(async/await)的相關資料,FileReader是前端進行文件處理的一個重要的Api,特別是在對圖片的處理上,如果你想知道圖片的處理原理,你就永遠不可能繞過它,需要的朋友可以參考下
    2023-11-11
  • 微信小程序實現(xiàn)授權登錄

    微信小程序實現(xiàn)授權登錄

    這篇文章主要為大家詳細介紹了微信小程序實現(xiàn)授權登錄,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05

最新評論