使用 Object.assign 遍历对象中的对象

looping through objects within an object with Object.assign

下面的脚本当前输出:

{
    "title1": {
        "0": "undefined"
    },
    "title2": "& three",
    "title3": "& four"
}

期望的输出是:

 {
      "title1": {
        "nested1": "one",
        "nested2": "& two"
      },
      "title2": "& three ",
      "title3": "& four"
    }

我的问题是 if 语句中需要什么才能成功循环遍历 [key][innerKey] 的属性并将它们传递给编码函数并将它们 return 传递给 'out'?

我一直在尝试在 if 语句的第一部分使用 for 循环来解决它,但没有成功。我认为它需要遵循以下逻辑:

谢谢。

var arr = {
  "title1": {
    "nested1": "one",
    "nested2": "& two"
  },
  "title2": "& three ",
  "title3": "& four"
};

var encodedValues = Object.keys(arr).reduce(function(out,key,innerKey) {

  if (typeof arr[key] == "object") {
     return Object.assign(out, {[key]: {[innerKey]: encode(arr[key][innerKey])}})

  } else {
     return Object.assign(out, {[key]: encode(arr[key])})
  }

}, {});

console.log(encodedValues)

我认为这样的事情应该可行:

function encodeValues(arr) {
  Object.keys(arr).forEach(item => {
    if (typeof arr[item] === "object") encodeValues(arr[item]);
    else arr[item] = encode(arr[item]);
  });
  return arr;
}

var encodedValues = encodeValues(arr);

ES5 中的相同代码:

function encodeValues(arr) {
  var keys = Object.keys(arr);
  for (var i = 0; i < keys.length; i++) {
    if (typeof arr[keys[i]] === "object") encodeValues(arr[keys[i]]);
    else arr[keys[i]] = encode(arr[keys[i]]);
  }
 return arr;
}

var encodedValues = encodeValues(arr);

这适用于您拥有的每个深度(嵌套在其他对象中的对象)

这样的事情怎么样? (递归)

var arr = {
  "title1": {
    "nested1": "one",
    "nested2": "& two"
  },
  "title2": "& three ",
  "title3": "& four"
};

var encode = function(val){ return encodeURI(val) };

var encodeValues = function(arr){
  var obj = {};
    for(var key in arr){
    if(typeof arr[key] == "object"){
      obj[key] = encodeValues(arr[key]);
    }else{
      obj[key] = encode(arr[key]);
    }
  }
  return obj;
};

var encodedValues = encodeValues(arr);

console.log(encodedValues);