Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.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 查找嵌套对象_Javascript - Fatal编程技术网

Javascript 查找嵌套对象

Javascript 查找嵌套对象,javascript,Javascript,考虑一个对象 var obj = { val: 123, vals: { val: 45, vals: { val: 90 } }, name: 'abc', names: { name: 'xyz' } }; 我需要这样的东西: var obj = { val: 123, vals_val: 45, vals_vals_val: 90

考虑一个对象

var obj = {
    val: 123,
    vals: {
        val: 45,
        vals: {
            val: 90
        }
    },
    name: 'abc',
    names: {
        name: 'xyz'
    }
};
我需要这样的东西:

var obj = {
    val: 123,
    vals_val: 45,
    vals_vals_val: 90,
    name: 'abc',
    names_name: 'xyz'
};

有人能告诉我如何进入嵌套对象并访问属性及其值吗?我试着在循环中使用..,但没有得到任何想法。

你可以这样做。我要树立一个榜样:

var John={
年龄:23,,
地址:{
巴黎:“拉鲁”,
伦敦:“塔街”
},
姓:“史密斯”
};
文件。书写(“地址1:+John.Address.Paris”);
文件。书写(“姓氏:“+John.姓氏”);
文件。书写(“年龄:+John.Age”)
您可以使用
reduce()
方法并返回新对象作为结果

var obj={“val”:123,“vals”:{“val”:45,“vals”:{“val”:90},“name”:“abc”,“name”:{“name”:“xyz”}
功能键(数据,上一个=“”){
返回Object.keys(数据).reduce(函数(r,e){
var key=prev+(prev.length?'.'+e:e)
如果(数据类型[e]=“object”)对象。分配(r,键(数据[e],键))
else r[key]=数据[e]
返回r;
}, {})
}
变量r=键(obj)

log(r)
您可以采用递归方法删除与新键不相同的项

函数更新(对象){
功能iter(o,p){
Object.keys(o).forEach(函数(k){
变量t;
if(o[k]&&typeof o[k]=“object”){
iter(o[k],p.concat(k));
}否则{
t=p.concat(k)。连接(“”);
对象[t]=o[k];
}
如果(k!==t){
删除o[k];
}
});
}
国际热核实验堆(对象,[]);
}
var对象={val:123,val:{val:45,val:{val:90}},名称:'abc',名称:{name:'xyz'};
更新(对象);

console.log(对象)您正在谈论的对象也称为“字典”。看看这个问题的选择答案:看看这个,你能告诉我你给出的代码的逻辑或概述吗?我不希望逐行解释,只是一点概述或方法。Thanksarray传递
typeof==“object”
,它们的元素将变成键。如果任何一个值是数组,这将爆炸。更好的(但仍然不是防弹的)检查是
typeof data[e]==“object”&&object.getPrototypeOf(data[e])===object.prototype
如果任何值是
Date
对象,此解决方案将完全忽略该属性。