-1

我会问一个关于排序的问题。

假设我有一个对象数组:

let arrayToBeSorted = [
{
  name:"name1",
  id:"id1",
},
{
  name:"name2",
  id:"id2",
},
{
  name:"name3",
  id:"id3",
},
{
  name:"name4",
  id:"id4",
},
{
  name:"name5",
  id:"id5",
},
{
  name:"name6",
  id:"id6",
}];

假设我有一个子数组数组,每个子数组都包含这样的 ID 字符串:

let sortArray = [["id2", "id1"], ["id5"], ["id6","id3","id4"]]

我想要做的是arrayToBeSorted根据sortArray保留的每个子数组进行排序(以保持密封顺序)

这是想要的结果:

arrayToBeSorted = [
{
  name:"name2",
  id:"id2",
},
{
  name:"name1",
  id:"id1",
},
{
  name:"name5",
  id:"id5",
},
{
  name:"name6",
  id:"id6",
},
{
  name:"name3",
  id:"id3",
},
{
  name:"name4",
  id:"id4",
}];

编辑:我试图:

arrayToBeSorted.sort((a,b)=> for(var i=0; i<sortArray.length;i++) 
{
   sortArr.indexOf(a.item.id) - sortArr.indexOf(b.item.id)
});

我还想过按每个数组排序并连接排序结果,但没有成功......

谢谢!

4

3 回答 3

1

您似乎在这里使排序操作过于复杂。使用sort()on并在 的一个tened副本中 arrayToBeSorted获取indexOf每个数组元素:flat()sortArray

let arrayToBeSorted = [{
  name: "name1",
  id: "id1",
}, {
  name: "name2",
  id: "id2",
}, {
  name: "name3",
  id: "id3",
}, {
  name: "name4",
  id: "id4",
}, {
  name: "name5",
  id: "id5",
}, {
  name: "name6",
  id: "id6",
}];

let sortArray = [
  ["id2", "id1"],
  ["id5"],
  ["id6", "id3", "id4"]
];

console.log(arrayToBeSorted.sort((a, b) => sortArray.flat().indexOf(a.id) - sortArray.flat().indexOf(b.id)));

于 2022-02-22T15:29:53.727 回答
1

您可以将数组展平并按照想要的顺序构建一个对象并对数组进行排序。

const
    data = [{ name: "name1", id: "id1" }, {  name: "name2", id: "id2" }, { name: "name3", id: "id3" }, { name: "name4", id: "id4" }, { name: "name5", id: "id5" }, { name: "name6", id: "id6" }],
    sortArray = [["id2", "id1"], ["id5"], ["id6", "id3", "id4"]],
    order = Object.fromEntries(sortArray.flat().map((k, i) => [k, i + 1]));

data.sort((a, b) => order[a.id] - order[b.id]);

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

于 2022-02-22T15:30:25.110 回答
0

您可以使用sort()基于扁平化的sortArrayusingfindIndex()indexOf()@esqew。您还可以更进一步,预处理sortArray并创建一个对象 ID 作为键和索引sortArray作为值。然后排序函数将基于对象如下:

let arrayToBeSorted = [{
        name: "name1",
        id: "id1",
    },
    {
        name: "name2",
        id: "id2",
    },
    {
        name: "name3",
        id: "id3",
    },
    {
        name: "name4",
        id: "id4",
    },
    {
        name: "name5",
        id: "id5",
    },
    {
        name: "name6",
        id: "id6",
    }
];

let sortArray = [["id2", "id1"], ["id5"], ["id6","id3","id4"]];

const flatO = Object.fromEntries( sortArray.flat().map((id,i) => [id,i]) );

const sortedArray = arrayToBeSorted.sort((a,b) => flatO[a.id] - flatO[b.id]);

console.log( sortedArray );

注意:这相当于@NinaScholz 的解决方案。刚发完这个就看到了。我对@NinaScholz 和@esqew 的解决方案都投了赞成票,但我会采用@NinaScholz 的解决方案,因为flat()包括创建order对象的方法只执行一次

于 2022-02-22T15:55:30.943 回答