2016-07-18 3 views
1

У меня есть объект, который имеет дерево как структура, напримерВозвращение объекта или объекта и его родительский объект

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 is находится в каком-то слое. например

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

Благодаря Demo, казалось бы, хороший код, который в конце концов вернулся неверный результат

+0

вы хотели бы получить только прямой родитель и сам узел, или все родители? –

+0

@NinaScholz только прямой родитель и сам узел, как 2-й сценарий, если объект является основным индексом в массиве, то только объект – Darlyn

ответ

1

Вы Коу ld расширяет вашу функцию с помощью параметра для фактического родителя.

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

+0

можно вернуть только объект, когда он является элементом в исходном массиве элемента в дочернем свойстве элемента? – Darlyn

+0

, пожалуйста, добавьте пример. –

+0

в массиве i, например, только findObj (x, 1) вернет {id: 1, name: one, children: []} -> объект с id 1 - это прямой индекс в массиве, например, вы можете получить к нему доступ через х [номер]. id, другие, к которым нужно получить доступ, например, x [число]. дети и т. д. должны быть возвращены с родительским и самим объектом, например, способом, которым вы возвращаете – Darlyn

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

Смежные вопросы