Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用object.assign在对象内的对象之间循环_Javascript_Arrays_If Statement_Assign - Fatal编程技术网

Javascript 使用object.assign在对象内的对象之间循环

Javascript 使用object.assign在对象内的对象之间循环,javascript,arrays,if-statement,assign,Javascript,Arrays,If Statement,Assign,下面的脚本当前输出: { "title1": { "0": "undefined" }, "title2": "& three", "title3": "& four" } 所需输出为: { "title1": { "nested1": "one", "nested2": "& two" }, "title2": "&am

下面的脚本当前输出:

{
    "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]的所有属性
  • 并通过函数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)

我认为这样做应该奏效:

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);
函数编码值(arr){
var keys=Object.keys(arr);
对于(变量i=0;i

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

像这样的东西怎么样?(递归)


你能把预期的结果贴出来吗?我不明白你想达到什么目的……是的,当然。很抱歉,不够清晰。刚刚更新了原始帖子。对象的深度总是==1吗?是的,如果我理解你的意思,我想是的,也就是说,没有比给出的示例更深层次的嵌套对象了。非常感谢你。奇怪的是,我只是尝试实现上面的和console.log(encodedValues);正在返回未定义的。将再次检查。@fivedoor ups,对不起,我没有测试ES5版本,并且我写的错误,现在应该可以了!啊,是的,对不起,我刚才突然想到了帕特的解决方案——现在也很有效。谢谢你的帮助!谢谢你。当我测试时,它工作得非常好。那么这是一个递归函数吗?当你在函数中引用编码值,它会自己循环回来吗?没错。我抓住机会使用递归:p
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);