使递归函数在 Javascript 中发挥作用

Make Recursive Function Functional in Javascript

我正在为 Javascript 个对象实施递归加密,但我提出的解决方案不起作用。这导致了一些奇怪的错误,因为它直接操作对象。有什么方法可以使这个函数(return 一个新的加密对象)?

我不知道如何使它保持递归并同时 return 一个新对象(功能)。具体来说就是 encryptObject(dd)

class Security {
  static encryptText = (text) => {
    //function to encrypt text/strings
  };
  static encryptObject(dd) {
    try {
      for (let d in dd) {
        if (!dd[d]) {
          continue;
        } else if (typeof dd[d] !== "object") {
          dd[d] = this.encryptText(dd[d]);
        } else {
          this.encryptObject(dd[d]);
        }
      }
    } catch (e) {
      console.log(e.message + `error encrypting`);
    }
  }
const data = {dog:"john", cat:"anders", weapons:{laser:"3",sword:"1"}}
Security.encrypt(data)

我想改为这样调用函数

const data = {dog:"john", cat:"anders", weapons:{laser:"3",sword:"1"}}
const encryptedData = Security.encrypt(data)

只是创建并 return 一个新对象?

static encryptObject(objectToEncrypt) {
    try {
        const newObj = {};
        for (const [key, value] of Object.entries(objectToEncrypt)) {
            if (!value) {
                newObj[key] = value;
            } else if (typeof value !== "object") {
                newObj[key] = this.encryptText(value);
            } else {
                newObj[key] = this.encryptObject(value);
            }
        }
        return newObj;
    } catch (e) {
        console.log(e.message + `error encrypting`);
    }
}

编写此代码的一种方法是将其基于处理数组和对象的 map 函数。有了这个和一个简单的身份函数(x) => x,我们可以把它写成

const encryptObj = (o) =>
  (typeof o == 'object' ? map (encryptObj) : typeof o == 'string' ? encryptText : x => x) (o)

根据我们是否拥有对象、字符串或其他内容,我们选择将结果递归映射到子项上,调用文本加密,或者 return 值不变。使用一个简单的 rot13 函数作为虚拟文本加密,我们可以编写一个像这样的普通函数:

const map = (fn) => (o) => Array .isArray (o) 
  ? o .map (fn) 
  : Object .fromEntries (Object .entries (o) .map (([k, v]) => [k, encryptObj (v)]))

// simple rot13
const encryptText = (cs) => [...cs] .map ((c, i, _, cc = cs.charCodeAt (i)) => cc > 64 && cc <= 91 ? String .fromCharCode (65 + ((cc - 52) % 26)) : cc > 96 && cc <= 123 ? String .fromCharCode (97 + ((cc - 84) % 26)) : c) .join ('')

const encryptObj = (o) =>
  (typeof o == 'object' ? map (encryptObj) : typeof o == 'string' ? encryptText : x => x) (o)

console .log (encryptObj ({
  a: 'foo',
  b: ['bar', 'baz', 'qux'],
  c: false,
  d: {
    e: {
      f: {
        g: {
          h: 42,
          i: 'CORGE',
          j: {
            k: 'Grault'
          }
        }
      },
      l: 99
    }
  }
}))
.as-console-wrapper {max-height: 100% !important; top: 0}

当然,您可以通过在代码周围添加一些 this 使其成为 class 的静态函数。