使用Object.assign循环遍历对象内的对象

时间:2016-07-08 15:32:19

标签: javascript arrays if-statement assign

下面的脚本目前输出:

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

所需的输出是:

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

我的问题是if语句中成功循环[key] [innerKey]的属性并将它们传递给encode函数并将它们返回'out'需要什么?

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

  • 如果arr [key]是一个对象,那么
  • 输出[key]:
  • 然后遍历[key]
  • 的所有属性
  • 并通过函数encode
  • 传递它们
  • 并将其返回'out'

感谢。

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)

2 个答案:

答案 0 :(得分:3)

我认为这样的事情应该有效:

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

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

答案 1 :(得分:2)

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

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