亚咪吧 关注:15贴子:538
  • 4回复贴,共1

js 拷贝数组的4个方式

只看楼主收藏回复

js复制数组的4种方式
var a=[1,2,3]
var c=[].concat(a)
var c=a.slice(0)
var c=Array.from(a)
var c=[...a]


IP属地:福建1楼2023-07-25 09:31回复
    js复制数组的4种方式
    var a=[1,2,3]
    var c=[].concat(a)
    var c=a.slice(0)
    var c=Array.from(a)
    var c=[...a]
    map filter reduce 浅拷贝
    注意这四种都是浅拷贝,如果是引用对象类型
    var a=[{like:"彩花"}]
    Object.assign 浅拷贝
    深拷贝:
    JSON.parse(JSON.stringify(list))
    还是有点问题,有些类型不支持


    IP属地:福建2楼2023-07-25 11:55
    回复
      JSON.stringify(myJson) 是一个 JavaScript 方法,用于将 JavaScript 对象转换为 JSON 字符串。默认情况下,它生成的 JSON 字符串没有格式化,每个属性都以逗号分隔,并使用双引号括起来。
      如果你想控制输出格式,你可以使用 JSON.stringify 的 replacer 和 space 参数。
      replacer 是一个函数,用于自定义对象的转换过程。例如,你可以定义一个函数,用于将对象属性名转换为小写,属性值转换为大写。
      javascript复制function convertToUpperCase(key, value) { return { 'key': value.toUpperCase() };}var myJson = { 'key': 'value'};var jsonString = JSON.stringify(myJson, convertToUpperCase);console.log(jsonString);// 输出: {"key":"VALUE"}
      space参数用于指定生成的 JSON 字符串的空格数。默认情况下,生成的 JSON 字符串没有空格。例如,你可以设置space` 为 4,生成如下的 JSON 字符串:
      javascript复制var myJson = { "key1": "value1", "key2": "value2"};var jsonString = JSON.stringify(myJson, null, 4);console.log(jsonString);// 输出: {"key1": "value1", "key2": "value2"}
      请注意,以上示例中的 convertToUpperCase 和 4 参数是手动设置的,你可能需要根据具体需求进行修改。


      IP属地:福建3楼2023-07-25 11:56
      回复
        JSON.stringify(list) 和 JSON.parse(JSON.stringify(list)) 都不是真正的深拷贝方法,它们只能处理基本数据类型和简单的对象结构。如果列表中包含复杂对象、数组、日期、函数等,那么这些方法将无法正确处理。
        以下是一些情况下不适用 JSON.parse(JSON.stringify(list)) 的情况:
        列表中包含复杂对象:如果列表中包含对象、数组、日期、函数等复杂数据类型,那么使用 JSON.parse(JSON.stringify(list)) 将无法正确处理这些数据类型。
        列表中包含引用数据类型:如果列表中包含引用数据类型(例如对象、数组、函数等),那么使用 JSON.parse(JSON.stringify(list)) 将无法正确处理这些数据类型的引用。
        列表中包含循环引用:如果列表中包含循环引用,那么使用 JSON.parse(JSON.stringify(list)) 将无法正确处理这些数据类型的引用。
        列表中包含未定义属性:如果列表中包含未定义的属性,那么使用 JSON.parse(JSON.stringify(list)) 将无法正确处理这些数据类型的属性。
        对于以上情况,应该使用深拷贝方法来创建真正的拷贝。常见的深拷贝方法包括使用递归、使用 JSON.parse(JSON.stringify(json)) + JSON.stringify(JSON.parse(json)) 或者使用其他第三方库。


        IP属地:福建4楼2023-07-25 11:58
        回复
          在JavaScript中,实现深拷贝需要处理对象中的嵌套引用。默认情况下,JSON.stringify()和JSON.parse()函数会进行浅拷贝,即复制对象中的引用,而不是复制引用本身。
          以下是一个简单的实现深拷贝的函数:
          javascript复制function deepClone(obj) { let clone = Object.assign({}, obj); for(let i in clone) { if(typeof clone[i] == "object" && clone[i] != null) { clone[i] = deepClone(clone[i]); } } return clone;}
          这个函数首先使用Object.assign()方法创建一个新对象,这个新对象是原始对象的浅拷贝。然后,它遍历新对象的属性,如果属性是对象(也就是说,它引用了一个对象),那么它就递归调用deepClone()函数来复制这个对象。
          这个函数的工作原理是创建一个新的对象,然后递归地复制这个对象中的所有属性。它主要解决了一些深拷贝中可能出现的问题,如循环引用等。
          注意:此函数并不能解决所有的深拷贝问题。例如,如果对象包含一些原始类型的数据(例如,字符串、数字、布尔值等),或者包含函数,这个函数将无法处理。在这种情况下,你可能需要使用其他的方法,如使用JSON.stringify()和JSON.parse(),但是你需要明确地处理这些情况。


          IP属地:福建5楼2023-07-25 12:00
          回复