【问题标题】:Javascript deepcopy without JSON or variable assignment没有 JSON 或变量分配的 Javascript deepcopy
【发布时间】:2020-12-05 23:46:50
【问题描述】:

我有一个 JavaScript 问题: 我正在从我正在学习的一本 JS 书中做一些挑战练习,但我不知道如何去做,也没有示例答案。目的是使用*仅 ES6* 的箭头函数编写深拷贝函数,而不使用任何 JSON 方法或任何变量赋值。作者还建议不要使用{} 方括号。关于我如何做到这一点的任何提示或提示?

【问题讨论】:

  • 创建一个递归函数,它接受一个值并返回它的副本。检查值的类型。如果它是原始的(字符串、数字、布尔值......),只需返回它。如果它是一个数组,则返回一个新数组,它将每个元素映射到该函数的递归调用,如果它是一个对象,则对每个属性执行相同的操作。如果您在使用 ES6 时遇到问题,请先在 ES5 中执行,直到您可以使用它,然后尝试“翻译”它,但这应该不是那么困难
  • 我已经在 ES5 中实现了它,但是由于我不确定如何处理返回值,所以我很难理解三元组。也看过你下面的帖子。它按预期工作,我看到你用嵌套的三元组(三元组?)做了什么

标签: javascript function ecmascript-6


【解决方案1】:

创建一个接受值并返回其副本的递归函数。检查值的类型。如果它是一个数组,则返回一个新数组,它将每个元素映射到该函数的递归调用。如果它是一个对象,则创建一个具有其属性副本的新对象。如果它是原始的(字符串、数字、布尔值...),则返回它。

附带说明,在没有任何变量赋值和大括号的情况下编写此代码可能会很有趣,但它会降低可读性。我会在工作中永远不会这样写

const deepCopy = v =>
  // Is it an Array?
  v instanceof Array ?
    // If it is, map every value to its copy
    v.map(deepCopy) :
    // Otherwise, is it a non-null Object?
    (typeof v === "object" && v !== null) ? 
      // If it is, create a new Object with copies of its property values
      Object.entries(v)
            .reduce((acc, [k, v]) => ({ ...acc, [k]: deepCopy(v) }), {}) :
      // Otherwise, just return the value
      v;


console.log(deepCopy({foo: 'bar', arr: [{baz: 42}, true]}));
console.log(deepCopy("Hello world"));
console.log(deepCopy(["a", "b", null]));

【讨论】:

    【解决方案2】:

    您可以使用 Object.keys() 和 Object.values() 获取键和值的数组,然后迭代并将这些项目分配给一个新对象,试试这个:

    let obj = {key1: 'value1', key2: 'value2'};
    
    let keys = Object.keys(obj);
    let values = Object.values(obj)
    
    console.log(keys, values)
    
    let newObj = {};
    
    for( let i = 0; i < keys.length; i++ ){
        newObj[keys[i]] = values[i] 
    }
    
    console.log(newObj);
    
    newObj.key1 = 'asd';
    
    console.log(newObj);

    【讨论】:

    • let obj = { foo: { bar: 42 } } 怎么样? (内部对象不会是副本,它将是对原始对象的引用)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多