【问题标题】:Lodash - Move object to first place in array than sort by another propertyLodash - 将对象移动到数组中的第一位而不是按另一个属性排序
【发布时间】:2019-12-05 21:30:48
【问题描述】:

我有一个对象员工数组

    {
  "emp1": {
    "BusinessPartnerFormattedName": "Aleksandra Lewandowski",
    "EmpRoleCode": "BUP003",
    "EmpRoleType": "Employee",
    "EmployeeID": "E8000",
    "isAssigned" : true,
    "ObjectID": "00163E0E46241ED7A0EA0590D0655967"
  },
  "emp2": {
    "BusinessPartnerFormattedName": "Aleksandra Lewandowski",
    "EmpRoleCode": "BUP003",
    "EmpRoleType": "Employee",
    "EmployeeID": "E8000",
    "isAssigned" : true,
    "ObjectID": "00163E0E46241ED7A0EA0590D0655967"
  },
  "emp3": {
    "BusinessPartnerFormattedName": "Aleksandra Lewandowski",
    "EmpRoleCode": "BUP003",
    "EmpRoleType": "Employee",
    "EmployeeID": "E8000",
    "isAssigned" : false,
    "ObjectID": "00163E0E46241ED7A0EA0590D0655967"
  },
  "emp4": {
    "BusinessPartnerFormattedName": " Lewandowski",
    "EmpRoleCode": "BUP803",
    "EmpRoleType": "Employee",
    "EmployeeID": "BUP803",
    "isAssigned" : false,
    "ObjectID": "00163E0E46241ED7A0EA0590D0655967"
  },
  "emp5": {
    "BusinessPartnerFormattedName": "Aleksandra",
    "EmpRoleCode": "BUP043",
    "EmpRoleType": "Employee",
    "EmployeeID": "BUP043",
    "isAssigned" : false,
    "ObjectID": "00163E0E46241ED7A0EA0590D0655967"
  },
  "emp6": {
    "BusinessPartnerFormattedName": "Eva Log",
    "EmpRoleCode": "BUP0d03",
    "EmpRoleType": "Employee",
    "EmployeeID": "BUP0d03",
    "isAssigned" : false,
    "ObjectID": "00163E0E46241ED7A0EA0590D0655967"
  }
}

我想把EmployeeID等于E8000的员工放在列表中first,比我想要isAssigned等于的员工true关注

到目前为止,我已经做到了:

var sortedItems = _.sortBy(items, function(item) {
  return (item.isAssigned === true || item.EmployeeID === "E8000") ? 0 : 1;
});

但是如何确保带有EmployeeID 的emp 等于E8000 总是在最前面呢?

【问题讨论】:

  • 你有超过三个项目吗?如果更多应该怎么办?
  • 顺便说一句,您正在尝试对对象进行排序,因为该数组只有一项...
  • @NinaScholz 是的,我有 99 个项目,但我的代码是一个简单的示例
  • 但正如 Nina 所说,您无法对对象进行排序。你的意思是一个对象数组吗? (没有这些emp1、emp2 等)键?
  • @kinduser 是的对象数组,我做了一些更正(很抱歉造成混乱)

标签: javascript sorting lodash


【解决方案1】:

不知道为什么你需要 lodash:

items.sort((a,b)=>{
    if(a.EmployeeID !== b.EmployeeID){
        if(a.EmployeeID === 'E8000') return -1;
        if(b.EmployeeID === 'E8000') return 1;
    };

    if(a.isAssigned !== b.isAssigned){
        return a.isAssigned ? -1 : 1;
    }

    //Remaining sort logic...
})

这转化为:

"在决定是 a 还是 b 应该先出现时,如果 a 和 b 的 EmployeeID 值不同,请检查其中一个是否具有值 E8000。如果以太有那个值,把那个放在第一位。

否则,检查a 和b 是否与isAssigned 具有相同的值,如果没有,则将具有true 的值作为isAssigned 的值放在第一位。

最后,如果不满足前面的条件,请按照您想要设置的任何逻辑设置哪个应该先执行。

当然,你必须填写任何你想在那之后的排序逻辑。例如,如果您想在BusinessPartnerFormattedName 上按字母顺序排序,您可以在Remaining sort logic... 块中填充:

if(a.BusinessPartnerFormattedName < b.BusinessPartnerFormattedName) return -1;
if(a.BusinessPartnerFormattedName > b.BusinessPartnerFormattedName) return 1;
return 0;

【讨论】:

  • 我只是喜欢 lodash,个人选择,但感谢您的香草方法
  • 这没有任何意义...... OP 有一个对象数组,里面有一个嵌套对象......你的解决方案不会解决它
  • @kinduser- 你是对的!抱歉,我认为顶级对象是一个数组。 napi15,如果您的顶级对象不是数组,这将不起作用。
  • @DRich 似乎适合 OP 问题:)
【解决方案2】:

你链接想要的排序顺序。

var array = [
        { name: "E8000 true", EmployeeID: "E8000", isAssigned : true },
        { name: "E8000 true", EmployeeID: "E8000", isAssigned : true },
        { name: "E8003 false", EmployeeID: "E8003", isAssigned : false },
        { name: "E8001 true", EmployeeID: "E8001", isAssigned : true },
        { name: "E8002 true", EmployeeID: "E8002", isAssigned : true },
        { name: "E8001 false", EmployeeID: "E8001", isAssigned : false }
    ];

array.sort((a, b) => 
    (b.EmployeeID === 'E8000') - (a.EmployeeID === 'E8000') ||
    b.isAssigned - a.isAssigned
);

console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

用 lodash

var array = [
        { name: "E8000 true", EmployeeID: "E8000", isAssigned : true },
        { name: "E8000 true", EmployeeID: "E8000", isAssigned : true },
        { name: "E8003 false", EmployeeID: "E8003", isAssigned : false },
        { name: "E8001 true", EmployeeID: "E8001", isAssigned : true },
        { name: "E8002 true", EmployeeID: "E8002", isAssigned : true },
        { name: "E8001 false", EmployeeID: "E8001", isAssigned : false }
    ];

console.log(_.sortBy(array, [
    o => o.EmployeeID !== 'E8000',
    o => !o.isAssigned
]));
.as-console-wrapper { max-height: 100% !important; top: 0; }
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"&gt;&lt;/script&gt;

【讨论】:

  • 正是我想要的 danke schon :)
【解决方案3】:

您提供的数据具有很强的误导性,但是我仍然想发布我的解决方案,因为基本上我只是喜欢它。

const items = [{BusinessPartnerFormattedName:"Aleksandra Lewandowski",EmpRoleCode:"BUP003",EmpRoleType:"Employee",EmployeeID:"E7000",isAssigned:!0,ObjectID:"00163E0E46241ED7A0EA0590D0655967"},{BusinessPartnerFormattedName:"Aleksandra Lewandowski",EmpRoleCode:"BUP003",EmpRoleType:"Employee",EmployeeID:"E6000",isAssigned:!1,ObjectID:"00163E0E46241ED7A0EA0590D0655967"},{BusinessPartnerFormattedName:"Aleksandra Lewandowski",EmpRoleCode:"BUP003",EmpRoleType:"Employee",EmployeeID:"E8000",isAssigned:!1,ObjectID:"00163E0E46241ED7A0EA0590D0655967"}];
const helper = (emp) => emp.EmployeeID === 'E8000' ? 2 : +(!!emp.isAssigned);

const r = items.sort((a, b) => helper(b) - helper(a));

console.log(r);

【讨论】:

  • 感谢您的回答,但是我想改进我的问题,您介意告诉我什么是误导,以便我进行编辑吗?
  • @napi15 所以基本上你已经发布了一个对象数组,但是这些对象内部是一个嵌套对象,键为“emp1”、“emp2”等,这些键的值是员工对象.所以它就像一个嵌套结构,但是所有已发布的答案都与平面对象数组相关(没有这些“emp1”、“emp2”键),只是一个员工对象数组
  • 哦,好的,是的,我注意到所有提供的答案都不符合我的嵌套结构,但我调整了提供的逻辑并再次感谢您的回答
猜你喜欢
  • 2017-11-11
  • 1970-01-01
  • 2016-04-20
  • 1970-01-01
  • 2019-03-23
  • 2016-03-18
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
相关资源
最近更新 更多