javascript найти родителя элемента массива - PullRequest
2 голосов
/ 01 марта 2011

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

var array = USA.NY[2];
// gives "Albany"

{"USA" : {
  "NY" : ["New York City", "Long Island", "Albany"]
}}

Я хочу найти состояние только из-за наличия массива.Как мне это сделать?Спасибо.

function findParent(array) {
  // do something
  // return NY
}

Ответы [ 2 ]

5 голосов
/ 01 марта 2011

В Javascript элементы массива не имеют ссылок на массив (ы), содержащие их.

Для этого вам понадобится ссылка на корневой массив, который будет зависеть от вашей модели данных.
Предполагая, что США доступны и содержат только массивы, вы можете сделать это:

function findParent(item) {
    var member, i, array;
    for (member in USA) {
        if (USA.hasOwnProperty(member) && typeof USA[member] === 'object' && USA[member] instanceof Array) {
            array = USA[member];
            for(i = 0; i < array.length; i += 1) {
                if (array[i] === item) {
                    return array;
                }
            }
        }
    }
}

Обратите внимание, что я переименовал параметр array в item, поскольку вы передаете значение (и элемент массива) и ожидаете, что массив будет возвращен.
Если вы хотите знать имя массива, вы должны вместо этого вернуть member.

1 голос
/ 05 января 2013

Вот обобщенная функция, которую можно использовать для поиска родительского ключа любого типа многомерного объекта.Я использую underscore.js по привычке и для краткости, чтобы абстрагировать массив от циклов ассоциативного массива.

(function (root, struct) {
    var parent = null;
    var check = function (root, struct) {
        _.each(root, function (value, key) {
            if (value == struct) {
                parent = key;
            } else if (root == struct) {
                parent = '_root';
            } else if (typeof value === 'object') {
                check(value, struct);
            }
        });
    }
    check(root, struct);
    return parent;
})
...