Javascript 如何使用base64转换所有数组/对象
实际上,我知道如何转换对象或数组中的所有项。 让我给你指路:Javascript 如何使用base64转换所有数组/对象,javascript,arrays,object,multidimensional-array,base64,Javascript,Arrays,Object,Multidimensional Array,Base64,实际上,我知道如何转换对象或数组中的所有项。 让我给你指路: var copyData = {}; var data = { "1":[["input","Was spielt Jakob gern?"],["input sag alt",["Jakob", "Er", " spielt nicht gern Basketball."]]], "2":[["input alt",["Lena", "Sie", " chattet gern."]],["input
var copyData = {};
var data = {
"1":[["input","Was spielt Jakob gern?"],["input sag alt",["Jakob", "Er", " spielt nicht gern Basketball."]]],
"2":[["input alt",["Lena", "Sie", " chattet gern."]],["input sag","Was macht Lena nicht gern?"]],
"3":[["input alt",["Meike", "Sie", " sieht gern fern."]],["input sag","Was macht Meike nicht gern?"]],
"4":[["input","Was spielt Tim gern?"],["input sag alt",["Tim", "Er", " spielt nicht gern Fußball."]]],
"5":[["input","Was spielt Simon gern?"],["input sag","Was spielt Simon nicht gern?"]],
"6":[["input alt",["Melanie", "Sie", " tanzt gern Hip Hop."]],["input sag","Was tanzt Melanie nicht gern?"]]
};
我的对象是名为data的对象。下面是我的for循环,用于将此对象转换为另一个对象,并对每个元素进行编码
for(var i in data){
copyData[i] = [];
for(var j in data[i]){
copyData[i][j] = [];
for(var g in data[i][j]){
if(typeof data[i][j][g] == "string"){
copyData[i][j][g] = btoa(data[i][j][g]);
} else {
copyData[i][j][g] = [];
for(var b in data[i][j][g]){
copyData[i][j][g][b] = btoa(data[i][j][g][b]);
}
}
}
}
}
如果你想控制copyData对象,你可以使用:
console.debug(JSON.stringify(dd));
结果是:
var copyData = {
"1":[["aW5wdXQ=","V2FzIHNwaWVsdCBKYWtvYiBnZXJuPw=="],["aW5wdXQgc2FnIGFsdA==",["SmFrb2I=","RXI=","IHNwaWVsdCBuaWNodCBnZXJuIEJhc2tldGJhbGwu"]]],
"2":[["aW5wdXQgYWx0",["TGVuYQ==","U2ll","IGNoYXR0ZXQgZ2Vybi4="]],["aW5wdXQgc2Fn","V2FzIG1hY2h0IExlbmEgbmljaHQgZ2Vybj8="]],
"3":[["aW5wdXQgYWx0",["TWVpa2U=","U2ll","IHNpZWh0IGdlcm4gZmVybi4="]],["aW5wdXQgc2Fn","V2FzIG1hY2h0IE1laWtlIG5pY2h0IGdlcm4/"]],
"4":[["aW5wdXQ=","V2FzIHNwaWVsdCBUaW0gZ2Vybj8="],["aW5wdXQgc2FnIGFsdA==",["VGlt","RXI=","IHNwaWVsdCBuaWNodCBnZXJuIEZ132JhbGwu"]]],
"5":[["aW5wdXQ=","V2FzIHNwaWVsdCBTaW1vbiBnZXJuPw=="],["aW5wdXQgc2Fn","V2FzIHNwaWVsdCBTaW1vbiBuaWNodCBnZXJuPw=="]],
"6":[["aW5wdXQgYWx0",["TWVsYW5pZQ==","U2ll","IHRhbnp0IGdlcm4gSGlwIEhvcC4="]],["aW5wdXQgc2Fn","V2FzIHRhbnp0IE1lbGFuaWUgbmljaHQgZ2Vybj8="]]
};
到目前为止一切正常。我的问题是:是否有任何阵列原型可以更轻松地完成这项工作。我查找Array.prototype.map(),但它使用常规数组或没有维度的对象。
有没有简单的方法可以做到这一点,或者我应该一直使用这种方法:)
感谢您的帮助。我想寻找一个递归解决方案:
function encodeString(obj) {
let type = typeof obj;
if (type === 'object') {
for (let key in obj) {
obj[key] = encodeString(obj[key]);
}
} else if (type === 'string') {
obj = btoa(obj);
}
return obj;
}
这将在位修改对象
虽然可以说人们不应该使用来。。。在数组对象上的
中,我认为这里的使用是合理的,因为它简化了代码,如果数组上有任何(可枚举的)字符串属性,您也希望更新它们。过去的情况是,对于。。。in
还将枚举数组的.length
属性,但在现代浏览器中不再是这种情况
如果您想要一个不就地修改的版本:
function encodeString(obj) {
let type = typeof obj;
if (type === 'object') {
let tmp = Array.isArray(obj) ? [] : {};
for (let key in obj) {
tmp[key] = encodeString(obj[key]);
}
return tmp;
} else if (type === 'string') {
return btoa(obj);
}
return obj;
}
但请注意,这不是一个完全安全的函数-如果传递的对象不是纯数据,它将产生“有趣的”结果,因为它不会深度克隆所有内容。我将寻找递归解决方案:
function encodeString(obj) {
let type = typeof obj;
if (type === 'object') {
for (let key in obj) {
obj[key] = encodeString(obj[key]);
}
} else if (type === 'string') {
obj = btoa(obj);
}
return obj;
}
这将在位修改对象
虽然可以说人们不应该使用来。。。在数组对象上的
中,我认为这里的使用是合理的,因为它简化了代码,如果数组上有任何(可枚举的)字符串属性,您也希望更新它们。过去的情况是,对于。。。in
还将枚举数组的.length
属性,但在现代浏览器中不再是这种情况
如果您想要一个不就地修改的版本:
function encodeString(obj) {
let type = typeof obj;
if (type === 'object') {
let tmp = Array.isArray(obj) ? [] : {};
for (let key in obj) {
tmp[key] = encodeString(obj[key]);
}
return tmp;
} else if (type === 'string') {
return btoa(obj);
}
return obj;
}
但请注意,这不是一个完全安全的函数-如果传递的对象不是纯数据,它将产生“有趣的”结果,因为它不会深度克隆所有内容。除了@的答案,您可以使用array.reduce
和array.map
递归
var数据={
“1”:[“输入”,“斯皮尔特·雅各布·格恩是谁?”],[“输入弧垂高度”,“雅各布”,“呃”,“斯皮尔特·尼希特·格恩篮球。”]],
“2”:[“输入alt”,“Lena”,“Sie”,“Chatter gern.”],[“输入sag”,“macht Lena nicht gern?”],
“3”:[“输入alt”]、[“Meike”、“Sie”、“sieht gern fern.”]、[“输入弧垂”、“macht Meike nicht gern?”],
“4”:[“输入”,“斯皮尔特·蒂姆·格恩是吗?”],[“输入弧垂高度”,“蒂姆”,“呃”,“斯皮尔特·尼希特·格恩·富尔。”],
“5”:[“输入”,“斯皮尔特·西蒙·格恩是吗?”],[“输入凹陷”,“斯皮尔特·西蒙·尼希特·格恩是吗?”],
“6”:[“输入alt”,“Melanie”,“Sie”,“tanzt gern Hip Hop.”],[“输入sag”,“tanzt Melanie nicht gern吗?”]]
};
var输出=Object.keys(数据).reduce(函数(p,c){
p[c]=btoaArray(数据[c]);
返回p;
}, {});
函数btoaArray(arr){
返回arr.map(函数(项){
返回数组.isArray(项目)?btoaArray(项目):btoa(项目)
})
}
console.log(output)
除了@的答案之外,您还可以使用array.reduce
和array.map递归使用
var数据={
“1”:[“输入”,“斯皮尔特·雅各布·格恩是谁?”],[“输入弧垂高度”,“雅各布”,“呃”,“斯皮尔特·尼希特·格恩篮球。”]],
“2”:[“输入alt”,“Lena”,“Sie”,“Chatter gern.”],[“输入sag”,“macht Lena nicht gern?”],
“3”:[“输入alt”]、[“Meike”、“Sie”、“sieht gern fern.”]、[“输入弧垂”、“macht Meike nicht gern?”],
“4”:[“输入”,“斯皮尔特·蒂姆·格恩是吗?”],[“输入弧垂高度”,“蒂姆”,“呃”,“斯皮尔特·尼希特·格恩·富尔。”],
“5”:[“输入”,“斯皮尔特·西蒙·格恩是吗?”],[“输入凹陷”,“斯皮尔特·西蒙·尼希特·格恩是吗?”],
“6”:[“输入alt”,“Melanie”,“Sie”,“tanzt gern Hip Hop.”],[“输入sag”,“tanzt Melanie nicht gern吗?”]]
};
var输出=Object.keys(数据).reduce(函数(p,c){
p[c]=btoaArray(数据[c]);
返回p;
}, {});
函数btoaArray(arr){
返回arr.map(函数(项){
返回数组.isArray(项目)?btoaArray(项目):btoa(项目)
})
}
console.log(output)
@Rajesh实际上我认为这是其中一种可能合适的情况-它会自动转换数组中可能存在的任何命名属性以及数字索引。我必须问-你到底为什么要这样做?您好@Rajesh thx,请回答。我从来没有说过这是最好或最好的方法。我只是说这是我的方式:)你好@Alnitak,我需要它,因为用户看不到问题的直接答案:)@Rajesh在现代浏览器中。长度不是可枚举的property@Rajesh实际上,我认为这是其中一种可能合适的情况——它会自动转换数组中可能存在的任何命名属性以及数字索引问-你到底为什么要这样做?你好@Rajesh thx,请回复。我从来没有说过这是最好或最好的方法。我只是说这是我的方式:)你好@Alnitak,我需要它,因为用户看不到问题的直接答案:)@Rajesh在现代浏览器中。长度不是一个可枚举的属性我相信这个函数不能转换我所有的数据?你能试着转换我在这页顶部写的数据变量吗?@HalilÇakar我会再测试一次,但当我尝试它时它似乎工作了。我只是尝试一下,它工作得很好。谢谢@alnitake因为这是一个非常通用的代码,我建议使用temp
变量并操作并返回它。在其他情况下可能不需要重写obj
。@Rajesh通常更喜欢这样,但这会使代码变得复杂一些,因为temp
变量的初始值有时是[]
,有时是{}
,我相信这个函数不能转换我所有的数据?你能试着把数据转换成数据吗