我會問一個關于排序的問題。
假設我有一個物件陣列:
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)
});
我還想過按每個陣列排序并連接排序結果,但沒有成功......
謝謝!
uj5u.com熱心網友回復:
您似乎在這里使排序操作過于復雜。使用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)));
uj5u.com熱心網友回復:
您可以將陣列展平并按照想要的順序構建一個物件并對陣列進行排序。
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; }
uj5u.com熱心網友回復:
您可以使用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物件的方法只執行一次。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/430957.html
標籤:javascript 数组 排序 数组数组
下一篇:在C中的陣列中隱藏偶數
