我有一個具有如下結構的物件:
let array = [
{
name: 'Name1',
items: [
{
name: 'Name1.1',
items: [
{ id: '1', name: 'Name1.1.1' },
{ id: '2', name: 'Name1.1.2' },
{ id: '3', name: 'Name1.1.3' }。
...
],
},
{
name: 'Name1.2',
items: [
{ id: '4'/span>, name: 'Name1.2.1' },
{ id: '5', name: 'Name1.2.2' },
],
},
],
},
{
name: 'Name2',
items: [
{
name: 'Name2.1',
items: [
{ id: '6'/span>, name: 'Name2.1.1' },
{ id: '7', name: 'Name2.1.2' },
],
},
],
},
];
我想獲得沒有兄弟元素的分支,通過id搜索。希望得到的結果是由id = '4'的下一個結構:
let array = [
{
name: 'Name1',
items: [
{
name: 'Name1.2',
items: [
{ id: '4'/span>, name: 'Name1.2.1' },
],
},
],
}
];
我只能找到樹的末端元素({ id: '4', name: 'Name1.2.1' })。但是我不明白如何獲得樹的中間結構。
const test = (data, id)=> {
if (!data || !data.length) return null;
for (var j = 0; j < data.length; j ) {
var result = data[j].items?
? test(data[j].items, id)
: data[j].id?
? data[j].id ==id
? data[j] .
: undefined ?
: undefined;
if (result !== undefined) {
return 結果。
}
}
return undefined;
};
test(array, '4') 。
uj5u.com熱心網友回復:
你確實應該采取遞回的方法,但是你的函式目前只能回傳一個id值(一個字串)或者null或者undefined。它從未回傳一個陣列,然而這正是你所期望得到的。
當一個解決方案被發現作為基礎案例時,你需要將該解決方案包裹在一個陣列和普通物件中,每次你都要從遞回樹中出來。
下面是一個有效的解決方案:
。function getPath(forest, targetid) {
for (let root of forest) {
if (root.id == targetid) return [root]; // base case
let items = root.items && getPath(root.items, targetid)。
if (items) return [{ ...root, items }]; // wrap!
}
}
//示例運行:
let array = [{name: 'Name1',items: [{name: 'Name1.1',items: [{ id: '1', name: 'Name1.1.1' },{ id: '2', name: 'Name1.1.2' },{ id: '3', name: 'Name1.1.3' },],},{name: 'Name1.2',items: [{ id: '4', name: 'Name1.2.1' },{ id: '5', name: 'Name1.2.2' },],],},{name: 'Name2',items: [{name: 'Name2.1',items: [{ id: '6'/span>, name: 'Name2.1.1' },{ id: '7', name: 'Name2.1.2' },],},]。
console.log(getPath(array, '4'));
<iframe name="sif1" sandbox="allow-forms allow-modals allow-scripts" class="snippet-box-edit snippet-box-result" frameborder="0"></iframe>
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/308799.html
標籤:
