Js中如何给所有树数组的对象添加一个item?

How to Add an item to All Tree Array's Objects in Js?

我想按顺序标识我的树数组中的所有对象。为此,我需要迭代所有数组对象和对象的子对象、孙对象等,并向每个对象插入 rowId

我有什么;

rows={[
  {
    car: 'Audi A4',
    city: 'Las Vegas',
    items: null,
    name: 'Sandra',
    sex: 'Female'
  },
  {
    car: 'Chevrolet Cruze',
    city: 'Tokyo',
    items: [
      {
        car: 'BMW 750',
        city: 'London',
        items: [
          {
            car: 'Toyota Corolla',
            city: 'Chicago',
            name: 'David',
            sex: 'Male'
          },
        ],
        name: 'Robert',
        sex: 'Male'
      }
    ],
    name: 'Sharon',
    sex: 'Female'
  }
]}

我所期望的;

rows={[
  {
    car: 'Audi A4',
    city: 'Las Vegas',
    items: null,
    name: 'Sandra',
    sex: 'Female',
    rowId: 1
  },
  {
    car: 'Chevrolet Cruze',
    city: 'Tokyo',
    items: [
      {
        car: 'BMW 750',
        city: 'London',
        items: [
          {
            car: 'Toyota Corolla',
            city: 'Chicago',
            name: 'David',
            sex: 'Male',
            rowId: 2
          },
        ],
        name: 'Robert',
        sex: 'Male',
        rowId: 3
      }
    ],
    name: 'Sharon',
    sex: 'Female',
    rowId: 4
  }
]}

当没有内部对象时,我可以像这样进行迭代;

rows.map((row, index) => ({ ...row, rowId: index }));

也尝试了一些递归方法,但 none 其中实际上有效,但都没有在网络上找到有用的东西。

正在寻找可以指导我完成此任务的天才开发人员。提前致谢。

您可以采用 depth-first search 算法并将 id 添加到每个对象。

const addId = (data, id) => {
        const iter = array => array.forEach(o => {
            if (o.items) iter(o.items); // search first
            o.id = id++;                // add later
        });
        iter(data);
    };
    
var rows = [{ car: 'Audi A4', city: 'Las Vegas', items: null, name: 'Sandra', sex: 'Female' }, { car: 'Chevrolet Cruze', city: 'Tokyo', items: [{ car: 'BMW 750', city: 'London', items: [{ car: 'Toyota Corolla', city: 'Chicago', name: 'David', sex: 'Male' },], name: 'Robert', sex: 'Male' }], name: 'Sharon', sex: 'Female' }];

addId(rows, 1);
   
console.log(rows);
.as-console-wrapper { max-height: 100% !important; top: 0; }