我有一个人员数组,需要先按定义的外部数组(order)排序,然后再按年龄排序。我正在使用lodash sortBy
const _ = require('lodash');
const arr = [
{ name: "Mandy", age: "34" },
{ name: "Shelly", age: "32" },
{ name: "Kyle", age: "12" },
{ name: "Kyle", age: "60" },
{ name: "Mandy", age: "32" },
{ name: "Mandy", age: "99" },
{ name: "Shelly", age: "30" },
{ name: "John", age: "3" },
{ name: "John", age: "1" },
{ name: "John", age: "6" },
{ name: "Mandy", age: "3" }
];
let order = ["Shelly", "John", "Mandy", "Kyle"];
let sortedArrByOrder = _.sortBy(arr, [person => order.indexOf(person.name), 'age'], ['asc', 'desc']);
console.log(sortedArrByOrder);但是年龄不是按降序排序的。有没有办法让它工作呢?
发布于 2019-11-15 01:40:36
_.sortBy()不排除order (asc / desc),改用_.orderBy():
const arr = [{ name: "Mandy", age: "34" },{ name: "Shelly", age: "32" },{ name: "Kyle", age: "12" },{ name: "Kyle", age: "60" },{ name: "Mandy", age: "32" },{ name: "Mandy", age: "99" },{ name: "Shelly", age: "30" },{ name: "John", age: "3" },{ name: "John", age: "1" },{ name: "John", age: "6" },{ name: "Mandy", age: "3" }];
const order = ["Shelly", "John", "Mandy", "Kyle"];
const sortedArrByOrder = _.orderBy(arr, [person => order.indexOf(person.name), 'age'], ['asc', 'desc']);
console.log(sortedArrByOrder);<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>
此外,在排序操作中使用Array.indexOf() (O(n)) (对于包含10个以上项的数组,使用O(NLogn))可能会影响性能。更好的方法是将order数组转换为具有O(1)检索的数据结构(如映射或纯对象),并存储数组中的原始索引。现在您可以直接获取原始索引:
const arr = [{ name: "Mandy", age: "34" },{ name: "Shelly", age: "32" },{ name: "Kyle", age: "12" },{ name: "Kyle", age: "60" },{ name: "Mandy", age: "32" },{ name: "Mandy", age: "99" },{ name: "Shelly", age: "30" },{ name: "John", age: "3" },{ name: "John", age: "1" },{ name: "John", age: "6" },{ name: "Mandy", age: "3" }];
const order = new Map(["Shelly", "John", "Mandy", "Kyle"].map((s, i) => [s, i]))
const sortedArrByOrder = _.orderBy(arr, [person => order.get(person.name), 'age'], ['asc', 'desc']);
console.log(sortedArrByOrder);<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>
发布于 2019-11-15 01:45:12
您可以接受回调并返回负年龄,并省略订单的数组。
const
arr = [{ name: "Mandy", age: "34" }, { name: "Shelly", age: "32" }, { name: "Kyle", age: "12" }, { name: "Kyle", age: "60" }, { name: "Mandy", age: "32" }, { name: "Mandy", age: "99" }, { name: "Shelly", age: "30" }, { name: "John", age: "3" }, { name: "John", age: "1" }, { name: "John", age: "6" }, { name: "Mandy", age: "3" }],
order = ["Shelly", "John", "Mandy", "Kyle"],
sortedArrByOrder = _.sortBy(arr, [
({ name }) => order.indexOf(name),
({ age }) => -age
]);
console.log(sortedArrByOrder);.as-console-wrapper { max-height: 100% !important; top: 0; }<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
https://stackoverflow.com/questions/58862705
复制相似问题