![](/img/trans.png)
[英]Find value in javascript array of objects deeply nested with ES6
[英]Find maximum id value in a deeply nested array of objects
我有一個樹數據結構,每個對象都包含子對象:
const data = {
id: 1,
name: "John",
parent_id: null,
children: [{
id: 2,
name: "Tess",
parent_id: 1,
children: []
},
{
id: 3,
name: "Tom",
parent_id: 1,
children: [{
id: 4,
name: "Harry",
parent_id: 3,
children: [{
id: 7,
name: "Thabo",
parent_id: 4,
children: []
}]
},
{
id: 5,
name: "Mary",
parent_id: 3,
children: []
},
{
id: 6,
name: "Madge",
parent_id: 3,
children: []
}
]
}
]
}
在向樹中添加新對象之前,我需要確定當前使用的最高id
值,以便我可以將下一個可用數字分配為新用戶的id
。
為此,我創建了一個初始值為 0 的新變量。然后我遍歷樹中的每個對象,如果對象的id
高於新 id,我將新 id 分配給當前 id 的值(想法是取最終值並加 1 得到新的 id)。
let newUserID = 0;
const newID = ( root, idKey ) => {
if ( root.id > idKey ) {
idKey = root.id;
}
root.children.forEach( ( obj ) => {
newID( obj, idKey );
});
return idKey;
}
newUserID = newID( data, newUserID );
console.log( newUserID );
我希望這會返回樹中最高的id
作為最終值,但實際發生的是,雖然新 id 確實會增加,直到它與最大值匹配,然后它又開始減少,以 1 結束。
這可以在這個JSFiddle中看到,其中包括一些日志記錄以在函數的不同點顯示新 ID 的值。
我已經使用不同的方法解決了這個問題(將id
值提取到一個新數組中,並使用Math.max()
來查找最大值),但我想了解為什么我的初始方法不起作用正如預期的那樣。 我可以看到idKey
值正在更新,但是之前的值在遞歸調用中被傳回,但我不知道為什么會發生這種情況或如何防止它。
只需將遞歸調用的返回值分配給idKey
:
let newUserID = 0;
const newID = ( root, idKey ) => {
if ( root.id > idKey ) {
idKey = root.id;
}
root.children.forEach( ( obj ) => {
idKey = newID( obj, idKey ); // <--------
});
return idKey;
}
newUserID = newID( data, newUserID );
console.log( newUserID );
如果沒有這個賦值,無論你遞歸多少,返回的值將只取決於頂部if
語句的結果。 這解釋了你得到的日志。
首先,關於為什么你的代碼被破壞:你只是錯過了一個任務。 你在哪里
newID( obj, idKey );
您忽略了結果值。 您需要將其分配回idKey
:
idKey = newID( obj, idKey );
這將解決你的問題。 我們還應該注意,變量名newUserID
有點用詞不當,因為它不是您將使用的新變量,而是找到的最高變量。 也許highestUserID
不會那么混亂?
但是,我們應該指出,這可以更簡單地編寫,使用Math .max
來完成繁重的工作和一些遞歸。 我可以這樣寫:
const maxId = ({id, children = []}) => Math .max (id, ... children .map (maxId)) const data = {id: 1, name: "John", parent_id: null, children: [{id: 2, name: "Tess", parent_id: 1, children: []}, {id: 3, name: "Tom", parent_id: 1, children: [{id: 4, name: "Harry", parent_id: 3, children: [{id: 7, name: "Thabo", parent_id: 4, children: []}]}, {id: 5, name: "Mary", parent_id: 3, children: []}, {id: 6, name: "Madge", parent_id: 3, children: []}]}]} console .log (maxId (data))
你可以使用遞歸來解決這個問題。 像下面
const data = { id: 1, name: "John", parent_id: null, children: [ { id: 2, name: "Tess", parent_id: 1, children: [], }, { id: 3, name: "Tom", parent_id: 1, children: [ { id: 4, name: "Harry", parent_id: 3, children: [ { id: 7, name: "Thabo", parent_id: 4, children: [], }, ], }, { id: 5, name: "Mary", parent_id: 3, children: [], }, { id: 6, name: "Madge", parent_id: 3, children: [], }, ], }, ], }; const findMax = (value) => { let max = -Infinity; const _findMax = (data) => { if (max < data.id) max = data.id; data.children.forEach(_findMax); }; _findMax(value); return max; }; console.log(findMax(data));
你可以做:
const data = {id: 1,name: 'John',parent_id: null,children: [{ id: 2, name: 'Tess', parent_id: 1, children: [] },{id: 3,name: 'Tom',parent_id: 1,children: [{id: 4,name: 'Harry',parent_id: 3,children: [{ id: 7, name: 'Thabo', parent_id: 4, children: [] }],},{ id: 5, name: 'Mary', parent_id: 3, children: [] },{ id: 6, name: 'Madge', parent_id: 3, children: [] },],},],} const arr = [...JSON.stringify(data).matchAll(/"id":(\d+)/g)].map(([, n]) => +n) const result = Math.max(...arr) console.log(result)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.