首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript Lodash按外部数组和内部属性排序

Javascript Lodash按外部数组和内部属性排序
EN

Stack Overflow用户
提问于 2019-11-15 01:34:41
回答 2查看 221关注 0票数 1

我有一个人员数组,需要先按定义的外部数组(order)排序,然后再按年龄排序。我正在使用lodash sortBy

代码语言:javascript
复制
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);

但是年龄不是按降序排序的。有没有办法让它工作呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-15 01:40:36

_.sortBy()不排除order (asc / desc),改用_.orderBy()

代码语言:javascript
复制
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);
代码语言:javascript
复制
<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)检索的数据结构(如映射或纯对象),并存储数组中的原始索引。现在您可以直接获取原始索引:

代码语言:javascript
复制
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);
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>

票数 1
EN

Stack Overflow用户

发布于 2019-11-15 01:45:12

您可以接受回调并返回负年龄,并省略订单的数组。

代码语言:javascript
复制
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);
代码语言:javascript
复制
.as-console-wrapper { max-height: 100% !important; top: 0; }
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58862705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档