Javascript 如何通过使某些元素始终位于顶部来对数组进行排序

Javascript 如何通过使某些元素始终位于顶部来对数组进行排序,javascript,reactjs,typescript,lodash,Javascript,Reactjs,Typescript,Lodash,我有一个数组,我想把某些项目始终放在上面。我从API得到如下响应 const itemInventorylocationTypes = [ { itemInventorylocationId: '00d3898b-c6f8-43eb-9470-70a11cecbbd7', itemInventorylocationCd: 'Rummsan' }, { itemInventorylocationId: '1e8cd068-3c

我有一个数组,我想把某些项目始终放在上面。我从API得到如下响应

const itemInventorylocationTypes = [
    {
        itemInventorylocationId: '00d3898b-c6f8-43eb-9470-70a11cecbbd7',
        itemInventorylocationCd: 'Rummsan'
    },
    {
        itemInventorylocationId: '1e8cd068-3cfc-4e25-af22-4a8fec3c794d',
        itemInventorylocationCd: 'Yes'
    },
    {
        itemInventorylocationId: 'f78fb228-7d1a-4cad-bde7-956e5f46db69',
        itemInventorylocationCd: 'Rambo'
    },
    {
        itemInventorylocationId: 'ce4a8a4d-a282-424b-bb2a-5a5187db02e0',
        itemInventorylocationCd: 'Veronica'
    },
    {
       itemInventorylocationId: '87082949-b148-4766-ad1d-148b91a46a79',
        itemInventorylocationCd: 'Hunnumous'
    },
    {
        itemInventorylocationId: '0fdaf8eb-07f4-4300-9c20-44f788724c59',
        itemInventorylocationCd: 'PerryPerry'
    },
    {
        itemInventorylocationId: '4f75ed92-68c0-4137-be37-d64ae77653c7',
        itemInventorylocationCd: 'Dont know why'
    },
    {
        itemInventorylocationId: '50efa718-6eed-4eff-ad13-305864c1b243',
        itemInventorylocationCd: 'Its ok'
    },
    {
        itemInventorylocationId: 'c7d3275b-cad9-45b2-9065-0fefdf7fc241',
        itemInventorylocationCd: 'This is some random thing'
    }
];
现在,我希望Veronica、rambo、Hunnumous、PerryPerry和Rummsan的元素按此顺序首先出现

为此,我创建了一个引用数组,然后使用lodash intersectionWith和differenceWith将它们分解

const referenceArray = ['Veronica', 'Rambo', 'Hunnumous', 'PerryPerry', 'Rummsan'];
 
export const sortitemInventory = (itemInventorylocationTypes: DropdownOption[]) => {
    const commonElements = _.intersectionWith(itemInventorylocationTypes, referenceArray, (x, y) => x.itemInventorylocationCd == y);
    const differentElements = _.differenceWith(itemInventorylocationTypes, referenceArray, (x, y) => x.itemInventorylocationCd == y);
    console.log(commonElements);
    console.log(differentElements);
    cosnst newArray = [...commonElements, ...differentElements];
};
 
期望公共元素按引用数组中的顺序出现。但我得到的是

const itemInventorylocationTypes = [
    {
        itemInventorylocationId: '00d3898b-c6f8-43eb-9470-70a11cecbbd7',
        itemInventorylocationCd: 'Rummsan'
    },
    {
        itemInventorylocationId: 'f78fb228-7d1a-4cad-bde7-956e5f46db69',
        itemInventorylocationCd: 'Rambo'
    },
    {
        itemInventorylocationId: 'ce4a8a4d-a282-424b-bb2a-5a5187db02e0',
        itemInventorylocationCd: 'Veronica'
    },
    {
        itemInventorylocationId: '87082949-b148-4766-ad1d-148b91a46a79',
        itemInventorylocationCd: 'Hunnumous'
    },
   {
        itemInventorylocationId: '0fdaf8eb-07f4-4300-9c20-44f788724c59',
        itemInventorylocationCd: 'PerryPerry'
    }
];

还有别的办法吗?我可能可以按每个元素循环,然后将其推送到新数组,但只需检查是否有更好的方法。

您可以这样做:

[Id:“00D38988888-C66-8-7-7-7-7-5-5-7-555F5F66FF46666DB69、Cd:“兰博”Cd:“兰博”Cd:,,,[Cd:,[Cd:,,,[Id:,,,,[Id:,[Id:“f78FB228FB228-7d1a-4-4cad-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-7-5-5-5-55555FFFFFFFF6666FFFFFFFFFF66666DB69 DB69 DB69 DB69 69 DB69-69,”Cd,”Cd:“Cd:“Cd:“兰博”Cd:“蓝博”Cd:“蓝博”Cd:“拉博”,”Cd:“拉博,”Cd:,[兰博”,},{Id:“0fdaf8eb-07f4-4300-9c20-44F78824C59”,Cd:“PerryPerry”},{Id:“4f75ed92-68c0-4137-be37-d64ae77653c7”,Cd:“不知道为什么”},{Id:“50efa718-6eed-4eff-ad13-305864c1b243”,Cd:“没问题”},{Id:“c7d3275b-cad9-45b2-9065-0fefdf7fc241”,Cd:“这是一些随机的东西”}, referenceArray=['Veronica','Rambo','Hunnumous','PerryPerry','Rummsan'], 优先级=Object.fromEntries(referenceArray.map((k,i)=>[k,i])) console.log(优先级) itemInventorylocationTypes.sort((a,b)=> priority.hasOwnProperty(b.Cd)-priority.hasOwnProperty(a.Cd) ||优先级[a.Cd]-优先级[b.Cd] )
console.log(itemInventorylocationTypes)
intersectionWith
在第一个参数中保存数组的顺序。这就是为什么需要对
commonElements
重新排序的原因。您可以referenceArray在将其用作引用之前。@HaoWu,反转referenceArray将只生成带有字符串的数组,而不是带有object的数组。