昨天面试被问到,要改变一个树形结构里面对象的所有key,不知道数据长度怎么做
答案:递归
自己调用自己,然后使用object.keys方法改变key
例子:
数据的结构
var data = [{
id: 1,
name: '家电',
goods: [{
id: 11,
gname: '冰箱',
goods: [{
id: 111,
gname: '海尔'
}, {
id: 112,
gname: '美的'
}, ]
}, {
id: 12,
gname: '洗衣机'
}]
}, {
id: 2,
name: '服饰'
}];
我们想要做输入id号,就可以返回的数据对象
function getID(json, id) {
json.forEach(function(item) {
if (item.id == id) {
console.log(item);
}
});
}
getID(data,1)
getID(data,2)
/*
{
id: 1,
name: '家电',
goods: [ { id: 11, gname: '冰箱', goods: [Array] }, { id: 12, gname: '洗衣机' } ]
}
{ id: 2, name: '服饰' }
*/
但获取不到下一层的对象
getID(data,11)
/*
*/
获取下一层对象就要用递归了
function getID(json, id) {
json.forEach(function(item) {
// 先判断外层
if (item.id == id) {
console.log(item);
}
// 再判断里层看是否有子节点,如果有,开始递归,forEach充当了递归的结束条件 else if只负责递归
else if(item.goods && item.goods.length > 0){
getID(item.goods,id)
}
});
}
getID(data,11)
/*
{
id: 11,
gname: '冰箱',
goods: [ { id: 111, gname: '海尔' }, { id: 112, gname: '美的' } ]
}
*/
如果想返回一个结果
function getID(json, id) {
var o = {}
json.forEach(function(item) {
if (item.id == id) {
o = item
}else if(item.goods && item.goods.length > 0){
getID(item.goods,id)
}
});
return o
}
console.log(getID(data,1));
console.log(getID(data,11));
/*
{
id: 1,
name: '家电',
goods: [ { id: 11, gname: '冰箱', goods: [Array] }, { id: 12, gname: '洗衣机' } ]
}
{}
*/