ES6 Object.assign() 拷贝问题

发布于 2022-09-13 00:20:10 字数 439 浏览 11 评论 0

  1. 类似以下格式怎么用Object.assign()一次完全拷贝?仅仅拷贝外层的生效的只有外层,里面的不拷贝, 2改变里面的数组1也是会变的;
  2. let arr1 = [
       {
         name: '小明',
         age: 18,
         arrs: [
           {color: 'red', num: 18}
         ]
       },
     ];
     let arr2 = arr1.map(item => Object.assign({},item)).concat();
     arr2[0].name = '菜鸟';
     arr2[0].arrs[0].color = 'yellow';
     console.log(arr1);
     console.log(arr2);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

橘和柠 2022-09-20 00:20:11

深拷贝?网上很多方法,搜一下。最简单的如果你的数据没有json不支持的数据类型的话可以用JSON.parse(JSON.stringify(data))

窗影残 2022-09-20 00:20:11

其实是一个深拷贝刚才朋友那了解到了一个工具lodashjs:

1. 安装: npm i --save lodash;
2. 使用: var _ = require('lodash');
let arr1 = [
      {
        name: '小明',
        age: 18,
        arrs: [
          {color: 'red', num: 18}
        ]
      },
    ];
    var _ = require('lodash');
    let arr2 = _.cloneDeep(arr1);
    arr2[0].name = '菜鸟';
    arr2[0].arrs[0].color = 'yellow';
    console.log(arr1);
    console.log(arr2);

第二种不用工具:

deepClone(data) {
  const type = this.judgeType(data);
  let obj;
  if (type === 'array') {
    obj = [];
  } else if (type === 'object') {
    obj = {};
  } else {
// 不再具有下一层次
    return data;
  }
  if (type === 'array') {
    // eslint-disable-next-line
    for (let i = 0, len = data.length; i < len; i++) {
      obj.push(this.deepClone(data[i]));
    }
  } else if (type === 'object') {
    // 对原型上的方法也拷贝了....
    // eslint-disable-next-line
    for (const key in data) {
      obj[key] = this.deepClone(data[key]);
    }
  }
  return obj;
},

judgeType(obj) {
  // tostring会返回对应不同的标签的构造函数
  const toString = Object.prototype.toString;
  const map = {
    '[object Boolean]': 'boolean',
    '[object Number]': 'number',
    '[object String]': 'string',
    '[object Function]': 'function',
    '[object Array]': 'array',
    '[object Date]': 'date',
    '[object RegExp]': 'regExp',
    '[object Undefined]': 'undefined',
    '[object Null]': 'null',
    '[object Object]': 'object',
  };
  if (obj instanceof Element) {
    return 'element';
  }
  return map[toString.call(obj)];
},
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文