使递归函数在 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 的静态函数。
我正在为 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 的静态函数。