如何使用base64转换所有数组/对象

时间:2017-01-25 09:32:51

标签: 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 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(),但它使用常规数组或具有out dimention的对象。 有没有简单的方法来做到这一点,或者我应该一直使用这种方式:) 感谢Advance。

2 个答案:

答案 0 :(得分:2)

我会寻找递归解决方案:

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;
}

但请注意,这是一个完全安全的功能 - 它会产生有趣的"结果如果传递的对象不是普通数据,因为它没有深度克隆所有内容。

答案 1 :(得分:1)

@ Alnitak答案的替代方案,您可以递归使用array.reduce array.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)