如何用base64转换所有array/object

How to convert all array/object with 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 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?"]]
    };

我的对象是一个名为数据的对象。这是我的 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;
}

这将修改对象。

虽然可以说不应该在数组对象上使用 for ... in,但我认为这里的使用是合理的,因为它简化了代码,如果数组上有任何(可枚举的)字符串属性,您会想要它们也更新了过去 for ... 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;
}

但请注意,这 不是 一个完全安全的函数 - 如果传递的对象不是纯数据,它将产生 "interesting" 结果,因为它不深度克隆一切。

替代@Alnitak的答案,您可以递归地使用array.reducearray.map

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?"]]
};

var output = Object.keys(data).reduce(function(p,c){
  p[c] = btoaArray(data[c]);
  return p;
}, {});

function btoaArray(arr){
  return arr.map(function(item){
    return Array.isArray(item) ? btoaArray(item) : btoa(item)
  })
}

console.log(output)

ES6版本

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?"]]
};

var output = Object.keys(data).reduce((p,c)=>(p[c] = btoaArray(data[c]), p), {});

function btoaArray(arr){
  return arr.map((item) => Array.isArray(item) ? btoaArray(item) : btoa(item))
}

console.log(output)