14人参与 • 2025-02-14 • Javascript
这是最基本、也是最常用的方法。sort() 方法会原地修改数组,并返回排序后的数组。你需要传入一个比较函数来定义排序逻辑。
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);
这种方法适用于当你不想改变原始数组时,可以先创建一个新的数组,然后进行排序。
const array = [ { name: 'alice', age: 25 }, { name: 'bob', age: 22 }, { name: 'charlie', age: 30 } ]; const sortedarray = array .map(item => item) // 复制数组 .sort((a, b) => a.age - b.age); console.log(sortedarray); console.log(array); // 原数组未改变
同样是为了不改变原数组,这种方法利用 slice() 创建一个数组的浅拷贝,然后进行排序。
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); // 原数组未改变
如果你需要对数组进行复杂的排序操作,可以使用 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);
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);
如果你希望根据多个字段进行排序,可以编写自定义的比较函数。
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);
在某些情况下,你可能需要一个稳定的排序算法。javascript 的原生 sort() 方法在不同浏览器上可能不是稳定的。可以使用 array-stable 库来确保稳定排序。
安装该库:
npm install array-stable
使用示例:
const stable = require('array-stable'); // 导入稳定排序库 const array = [ { name: 'alice', age: 25 }, { name: 'bob', age: 22 }, { name: 'charlie', age: 30 } ]; stable.sort(array, (a, b) => a.age - b.age); // 按年龄升序稳定排序 console.log(array);
对于字符串排序,特别是涉及到国际化时,可以使用 intl.collator 来处理。
const array = [ { name: 'éclair', age: 25 }, { name: 'alice', age: 22 }, { name: 'bob', age: 30 } ]; const collator = new intl.collator('fr', { sensitivity: 'base' }); // 创建法语语言环境的排序器 array.sort((a, b) => collator.compare(a.name, b.name)); // 按名称排序 console.log(array);
如果你希望在数组排序前后做一些额外操作,可以使用 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 包装数组 proxyarray.sort((a, b) => a.age - b.age); // 对代理数组进行排序 console.log(proxyarray);
如果数组中的对象包含大量数值,并且排序性能非常关键,可以考虑将数值提取到 typedarray 中进行排序,然后映射回原数组。
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]); // 根据排序后的索引重构数组 console.log(sortedarray);
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);
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);
const array = [ { name: 'alice', age: 25 }, { name: 'bob', age: 22 }, { name: 'charlie', age: 30 } ]; // 使用 reduce 和 object.entries 对对象数组按年龄升序排序 const sortedarray = object.values(array.reduce((acc, obj) => { acc[obj.age] = obj; return acc; }, {})); console.log(sortedarray);
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);
const array = [ { name: 'alice', score: 85 }, { name: 'bob', score: 75 }, { name: 'charlie', score: 95 }, { name: 'david', score: 80 } ]; // 按分数区间排序:低于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);
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] ]); // 按优先级排序 array.sort((a, b) => priorityorder.get(a.priority) - priorityorder.get(b.priority)); console.log(array);
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);
const array = ['item20', 'item5', 'item12', 'item1']; // 按字符串中的数字部分进行升序排序 array.sort((a, b) => { const numa = parseint(a.replace(/\d/g, '')); const numb = parseint(b.replace(/\d/g, '')); return numa - numb; }); console.log(array);
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);
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);
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);
const array = [1, 2, 3, 4, 5]; // 使用 math.random() 将数组随机打乱 array.sort(() => math.random() - 0.5); console.log(array);
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);
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数组里的对象排序的24个方法的文章就介绍到这了,更多相关js数组对象排序内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论