我的对象有树状结构,例如
var x = [{
id: '1',
name: 'one',
children: [{
id: '11',
name: 'oneone',
children: [{
id: '111',
name: 'oneoneone',
}]
}]
}]
有更多图层
使用功能
function findObj(obj, val) {
console.log(obj, val);
for (var i = 0; i < obj.length; i++) {
if (obj[i].id == val) {
return obj[i];
}
if (obj[i].hasOwnProperty('children') && obj[i].children.length > 0) {
var possibleResult = findObj(obj[i].children, val);
if (possibleResult) {
return {
child: possibleResult,
parent: obj[i]
}
}
}
}
}
如果它是数组x中的主索引,我缩进返回对象, 或结构if是否在某种层中。 e.g
console.log( findObj(x ,1 ))
返回
Object {id: "1", name: "one", children: Array[1]}
using console.log( findObj( x , 11 ));
返回
{
child : {
Object {id: "11", name: "oneone", children: Array[1]}
}
parent : {
Object {id: "1", name: "one", children: Array[1]}
}
}
在下一层中,例如
console.log( findObj( x , 111 ))
它返回
{
child:{
child:{},
parent:{}
}
parent:{
child:{}.
parent:{},
}
}
等等。我希望它只返回第一种和第二种情况的返回类型。有什么办法可以实现吗?我想弄清楚但却无法找到解决方案。
由于 Demo看起来很好的代码最终返回了错误的结果
答案 0 :(得分:1)
你应该试试这个:
function findObj(obj, val) {
for (var i = 0; i < obj.length; i++) {
if (obj[i].id == val) {
return obj[i];
}
if (obj[i].hasOwnProperty('children') && obj[i].children.length > 0) {
var possibleResult = findObj(obj[i].children, val);
if (possibleResult) {
if (possibleResult.child) { //Check if possibleResult has child property, than possibleResut is your result.
return possibleResult;
} else {
return {
child: possibleResult,
parent: obj[i]
}
}
}
}
}
}
您可以查看此更新 DEMO
答案 1 :(得分:1)
您可以使用实际父级的参数扩展您的函数。
function findObj(array, value, parent) {
var result;
array.some(function (a) {
if (a.id === value) {
result = parent ? [{ child: a, parent: parent }] : a;
return true;
}
if (Array.isArray(a.children)) {
return result = findObj(a.children, value, a);
}
});
return result;
}
var x = [{ id: '1', name: 'one', children: [{ id: '11', name: 'oneone', children: [{ id: '111', name: 'oneoneone', }] }] }];
console.log(findObj(x, '1'));
console.log(findObj(x, '11'));
console.log(findObj(x, '111'));