javascript 排序对象数组->如果键在数组中较晚出现,则更改顺序

rjzwgtxy  于 2023-01-19  发布在  Java
关注(0)|答案(2)|浏览(101)

假设我有一个对象数组:

let arrOfObjs = [
{
    "id": "unique1",
    "parentId": "unique3", // So this one is equal to arrOfObjs[2].id
    "title": "title1"
}, 
{
    "id": "unique2",
    "parentId": "unique3", // This one is also equal to arrOfObjs[2].id
    "title": "title2"
}, 
{
    "id": "unique3",
    "parentId": "",
    "title": "title3"
}
]

情况是:

  • id始终是唯一的
  • parentId不唯一。parentId等于其中一个对象中的ID之一

我想要达到的目标:
在数组中,id应该总是早于parentId。在上面的例子中,前两个对象包含**'unique3'**(3d对象的id)作为parentId。这种情况不应该发生。
所以应该这样排序:

let arrOfObjs = [
{
    "id": "unique3",
    "parentId": "",
    "title": "title3"
}
{
    "id": "unique2",
    "parentId": "unique3", 
    "title": "title2"
}, 
{
    "id": "unique1",
    "parentId": "unique3",
    "title": "title1"
}
]

所以基于对象的parentId,它应该找到与parentId相等的id,当具有该id的对象的索引更高时,该对象应该排在第一位。
这有点难以解释,但我希望它是明确的,让我知道,如果你有任何问题
还没有尝试过任何东西,不知道如何才能做到这一点。

wgx48brx

wgx48brx1#

试试这个:

arrOfObjs.sort((a, b) => {
  let aIndex = arrOfObjs.findIndex(obj => obj.id === a.parentId);
  let bIndex = arrOfObjs.findIndex(obj => obj.id === b.parentId);
  return aIndex - bIndex;
});
vhmi4jdf

vhmi4jdf2#

您可以存储所有id的位置并按parentId排序。

const
    data = [{ id: "unique1", parentId: "unique3", title: "title1" }, { id: "unique2", parentId: "unique3", title: "title2" }, { id: "unique3", parentId: "", title: "title3" }],
    order = Object.fromEntries(data.map(({ id }, i) => [id, i + 1]));

data.sort((a, b) => (order[a.parentId] || 0) - (order[b.parentId] || 0));

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

相关问题