簡體   English   中英

在深度嵌套的對象數組中查找最大 id 值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM