поиск во вложенном объекте javascript, получение массива предков - PullRequest
3 голосов
/ 12 сентября 2011

У меня есть вложенный массив, подобный этому:

array = [
    {
        "id": "67",
        "sub": [
            {
                "id": "663",
            },
            {
                "id": "435",
            }
        ]
    },
    {
        "id": "546",
        "sub": [
            {
                "id": "23",
                "sub": [
                 {
                     "id": "4",
                 }
             ]
            },
            {
                "id": "71"
            }
        ]
    }
]

Мне нужно найти 1 вложенный объект по его идентификатору и получить всех его родителей, создавая массив идентификаторов.

find.array("71")
=> ["546", "71"]

find.array("4")
=> ["546", "23", "4"]

Какой самый чистый способ сделать это?Спасибо.

Ответы [ 2 ]

8 голосов
/ 12 сентября 2011

Рекурсивный:

function find(array, id) {
  if (typeof array != 'undefined') {
    for (var i = 0; i < array.length; i++) {
      if (array[i].id == id) return [id];
      var a = find(array[i].sub, id);
      if (a != null) {
        a.unshift(array[i].id);
        return a;
      }
    }
  }
  return null;
}

Использование:

var result = find(array, 4);

Демо: http://jsfiddle.net/Guffa/VBJqf/

1 голос
/ 12 сентября 2011

Возможно это - jsonselect.org .

РЕДАКТИРОВАТЬ : я только что поиграл с JSONSelect и не думаю, что он подходит для ваших нужд, поскольку JSON не имеет встроенного родительского свойства, такого как xml.

Он может найти объект с соответствующим идентификатором, но вы не можете перейти вверх от этого.Например,

JSONSelect.match(':has(:root > .id:val("4"))', array)

возвращает меня:

[Object { id="4"}]

, что хорошо, просто я никуда не уйду отсюда!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...