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