【问题标题】:Mapping multidimensional array of objects in JavaScript在 JavaScript 中映射多维对象数组
【发布时间】:2019-05-21 14:40:00
【问题描述】:

我只需要通过查看单个节点来重新创建一个多维对象数组。

我尝试在循环中使用递归函数(Array.map)。

obj = [{
  key: 0,
  children: [{
    key: 1,
    children: [{
      key: 2,
      children: [{
        key: 3,
        children: []
      },
      {
        key: 4,
        children: []
      }]
    },
    {
      key: 5,
      children: [{
        key: 6,
        children: []
      },
      {
        key: 7,
        children: [] 
      },
      {
        key: 8,
        children: []
      }]
    }]
  }]
}]
function test(arg, level=0, arry=[]){

  arg.map((data, i) => {
    if(!data.arry){
      arry.push(data.key);
      data.arry = arry;
    }
    if(data.children){
      test(data.children, level+1, data.arry);
    }
  })
}

test(obj);

函数test 应该构建并返回与obj 完全相同的对象。 这只是我遇到的问题的简化版本,这就是为什么它看起来很奇怪(返回我已经拥有的对象)。我最初的问题是关于从 DB 中获取部分 n 维对象数组,但不知道其原始尺寸。所以我必须“发现”维度,然后构建完全相同的对象副本。

【问题讨论】:

  • 您可以使用 DFS 的变体来执行此操作。我将添加一个示例
  • 请添加想要的结果或输入。这个不清楚,你想要什么。
  • 功能测试应该构建并返回与 obj 完全相同的对象,但只查看单个节点。您可以想象它只有 obj 的第一个节点,然后使用 key 属性获取它。当所有节点和子节点都被发现时,它们应该被粘合在一起以形成完整的对象。粘合部分是我的问题所在。我是否必须为每个节点位置构建某种地图,然后使用地图重新创建它?
  • 获取密钥的事情我还不清楚。假设我们运行直到给定节点没有更多子节点,我将发布解决方案。

标签: javascript arrays multidimensional-array arrayobject


【解决方案1】:

一个示例实现是这样的:递归迭代数组和对象并深度复制它们的属性/子项。这会创建一个对象的深层副本,并测试数据是否实际被复制而不是引用:

 

   obj = [{
    key: 0,
    children: [{
        key: 1,
        children: [{
            key: 2,
            children: [{
                key: 3,
                children: []
            },
                {
                    key: 4,
                    children: []
                }]
        },
            {
                key: 5,
                children: [{
                    key: 6,
                    children: []
                },
                    {
                        key: 7,
                        children: []
                    },
                    {
                        key: 8,
                        children: []
                    }]
            }]
    }]
}];

function copy(obj) {
    let copiedObject;

    if (Array.isArray(obj)) {
        // for arrays: deep-copy every child
        copiedObject = [];
        for (const child of obj) {
            copiedObject.push(copy(child));
        }
    } else if (typeof obj === 'object') {
        // for objects: deep-copy every property
        copiedObject = {};
        for (const key in obj) {
            copiedObject[key] = copy(obj[key]);
        }
    } else {
        // for primitives: copy the value
        return obj;
    }

    return copiedObject;
}

function test() {
    const cpy = copy(obj);

    // make sure that deep-copying worked
    console.log('Values from obj should be exactly copied to cpy: ' + (cpy[0].children[0].children[0].key === obj[0].children[0].children[0].key));

    // make sure that references are broken, so that when data from the original object is updated, the updates do
    // NOT reflect on the copy
    obj[0].children[0].children[0].key = Math.random();
    console.log('Changes to obj should not reflect on cpy: ' + (cpy[0].children[0].children[0].key !== obj[0].children[0].children[0].key));
}


test();

【讨论】:

    猜你喜欢
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    • 2020-11-09
    • 2022-06-17
    • 2017-01-01
    相关资源
    最近更新 更多