微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

深度优先搜索的深度复制对象

如何解决深度优先搜索的深度复制对象

我试图复制一个对象。我想用深度优先搜索算法来实现。

function dfs(data) {
  let stack = [];
  let res = {};

  for (let key in data) {
    stack.push({ data: data[key],keyData: key });

    while (stack.length !== 0) {
      const first = stack.shift();

      if (typeof first.data === "object") {
        for (let key in first.data) {
          if (typeof first.data[key] === "object") {
            stack.push({ data: first.data[key],keyData: key });
          } else {
            res[first.parentKey] = first.keyData;
          }
        }
      } else {
        res[first.keyData] = first.data;
      }
    }
  }

  return res;
}

const data = {
  a: 1,b: 2,c: {
    d: 3,g: {
      e: 4,r: {
        y: 5,},};

const newData = dfs(data);

data.c.g.e = 5000;
data.c.g.d = 90000;

console.log("Original data",data);
console.log("copied data",newData);

我创建了一个函数,它将复制我的对象而没有旧对象上的链接我有一个问题,我的函数没有正确计算结果。我哪里出错了?

解决方法

深度优先搜索通常使用 recursion 实现:

function dfs(data) {
  if (typeof data === 'object') {
    const result = {};
    
    for (let key in data) {
      result[key] = dfs(data[key]);
    }
    
    return result;
  }
  
  return data;
}

const data = {
  a: 1,b: 2,c: {
    d: 3,g: {
      e: 4,r: {
        y: 5,},};

const newData = dfs(data);

data.c.g.e = 5000;
data.c.g.d = 90000;

console.log("Original data",data);
console.log("Copied data",newData);

这是一种迭代方法:

function dfs(data) {
  const result = {};
  const source = [['ROOT',data]];
  const target = [result];
  
  while (source.length) {
    const [k,v] = source.shift();
    const current = target.shift();
    const branch = typeof v === 'object';
    
    current[k] = branch ? {} : v;
    
    if (branch) {
      const entries = Object.entries(v);
      source.unshift(...entries);
      target.unshift(...Array(entries.length).fill(current[k]));
    }
  }
  
  return result.ROOT;
}

const data = {
  a: 1,};
const newData = dfs(data);

data.c.g.e = 5000;
data.c.g.d = 90000;

console.log("Original data",newData);

,

没有递归的 dfs 使用额外的堆栈来跟踪父属性。

    function dfs(data) {
        let stack = [];
        let stackres = [];
        let res = {};
    
        for (let key in data) {
            stack.push({ data: data[key],keyData: key });
            stackres.push(res);
    
    
            while (stack.length !== 0) {
                const first = stack.shift();
                const cur = stackres.shift();
    
                if (typeof first.data === "object") {
                    cur[first.keyData] = {};
                    for (let key in first.data) {
                        if (typeof first.data[key] === "object") {
                            stack.push({ data: first.data[key],keyData: key });
                            stackres.push(cur[first.keyData]);
                        } else {
                            cur[first.keyData][key] = first.data[key];
                        }
                    }
                } else {
                    cur[first.keyData] = first.data;
                }
            }
        }
    
        return res;
    }
    const data = {
      a: 1,c: {
        d: 3,g: {
          e: 4,r: {
            y: 5,};
    const newData = dfs(data);
    
    data.c.g.e = 5000;
    data.c.g.d = 90000;
    
    console.log("Original data",data);
    console.log("Copied data",newData);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?