我正在做一個排序演算法練習,但我被卡住了。我有一個物件陣列,其中可能包含嵌套物件,例如第一個嵌套物件。
我需要對包含一個或多個節點的所有“元素”陣列進行排序,其中“val”屬性 === targetValue 被移動到陣列的前面。
我需要創建一個 sortObject(object, targetValue) 函式來做到這一點。
例如:
const object = {
val: 1,
elements: [
{
val: 2,
children: [
{
val: 7,
elements: [
{val: 2},
{val: 18},
{val: 12}
]
}
]
},
{
val: 4,
elements: [
{val: 5},
{
val: 6,
elements: [
{val: 12},
{val: 11},
{val: 10},
{val: 9},
]
},
{val: 13}
]
},
{
val: 3,
elements: [
{val: 15}
]
},
{
val: 17,
elements: [
{val: 16},
{
val: 2,
elements: [
{val: 14},
{val: 11},
{
val: 18,
elements: [
{val: 4},
{val: 11},
{val: 7}
]
},
{val: 27},
{val: 18},
{val: 29},
]
}
]
}
]
};
如果我正在呼叫 sortObject(object, 18),這將變成(帶有下面提到的更改)
sortedObject = {
val: 1,
elements: [
{
val: 2,
elements: [
{
val: 7,
elements: [
{val: 18}, // <-- this moved up
{val: 2},
{val: 12}
]
}
]
},
{
val: 17, // <-- this moved up
elements: [
{
val: 2, // <-- this moved up
elements: [
{
val: 18, // <-- this moved up
elements: [
{val: 4},
{val: 11},
{val: 7}
]
},
{val: 18}, // <-- this moved up
{val: 14},
{val: 11},
{val: 27},
{val: 29},
]
},
{val: 16}
]
},
{
val: 4,
elements: [
{val: 5},
{
val: 6,
elements: [
{val: 12},
{val: 11},
{val: 10},
{val: 9},
]
},
{val: 13}
]
},
{
val: 3,
elements: [
{val: 15}
]
}
]
};
I started creating a sorting algorithm for it, but i couldn't make pass the first "elements" recursion.. and realized that how i was trying to do it would never work (I was creating a new array, getting the indexes of the child objects with the targetValue, and pushing to a new array..but this wouldn't work with the recursion) I'm stuck can anyone help?
uj5u.com熱心網友回復:
您可以進行廣度優先搜索并查找所需值并在找到該值時存盤該物件。如果集合包含物件,則按布林值對陣列進行排序。
const
sortObject = (object, value) => {
const
hasValue = new Set,
sort = object => {
let found = object.val === value;
if (object.elements) {
object.elements.forEach(o => found = sort(o) || found);
object.elements.sort((a, b) => hasValue.has(b) - hasValue.has(a));
}
if (found) hasValue.add(object);
return found;
};
sort(object);
return object;
},
object = { val: 1, elements: [{ val: 2, elements: [{ val: 7, elements: [{ val: 2 }, { val: 18 }, { val: 12 }] }] }, { val: 4, elements: [{ val: 5 }, { val: 6, elements: [{ val: 12 }, { val: 11 }, { val: 10 }, { val: 9 }] }, { val: 13 }] }, { val: 3, elements: [{ val: 15 }] }, { val: 17, elements: [{ val: 16 }, { val: 2, elements: [{ val: 14 }, { val: 11 }, { val: 18, elements: [{ val: 4 }, { val: 11 }, { val: 7 }] }, { val: 27 }, { val: 18 }, { val: 29 }] }] }] };
console.log(sortObject(object, 18));
.as-console-wrapper { max-height: 100% !important; top: 0; }
uj5u.com熱心網友回復:
如果排序順序是由18 的出現深度定義的,這樣它出現的深度越小,它應該出現在陣列中的越早,那么我會建議一種桶排序,其中有 18 個元素同時出現深度,將被放置在同一個桶中。然后將存盤桶連接起來成為已排序的elements陣列:
function sortObject(obj, target) {
const partition = {};
let minDepth = 10000; // depth of object should not exceed this limit
if (obj.elements?.length) {
for (const child of obj.elements) {
const depth = sortObject(child, target);
(partition[depth] ??= []).push(child);
minDepth = Math.min(minDepth, depth);
}
obj.elements = Object.values(partition).flat();
}
return obj.val === target ? 0 : minDepth (minDepth < 10000);
}
const object = {val: 1,elements: [{val: 2,elements: [{val: 7,elements: [{val: 2},{val: 18},{val: 12}]}]},{val: 4,elements: [{val: 5},{val: 6,elements: [{val: 12},{val: 11},{val: 10},{val: 9},]},{val: 13}]},{val: 3,elements: [{val: 15}]},{val: 17,elements: [{val: 16},{val: 2,elements: [{val: 14},{val: 11},{val: 18,elements: [{val: 4},{val: 11},{val: 7}]},{val: 27},{val: 18},{val: 29},]}]}]};
sortObject(object, 18);
console.log(object);
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/397330.html
