Javascript найти родителя элемента массива

У меня есть такой элемент массива:

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

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

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

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

person Mark    schedule 01.03.2011    source источник
comment
какая часть вашего вопроса является входной? понимаю что нужен вывод как NY....   -  person Vishwanath    schedule 01.03.2011
comment
@vishwanath вход - это переменная массива   -  person Mark    schedule 01.03.2011


Ответы (2)


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

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

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.

person Martijn    schedule 01.03.2011
comment
что, если у нас есть несколько пар ключ-значение? USA, Germany, AU, UK? мы должны зацикливаться внутри объекта? - person iamsujit; 27.07.2021

Вот общая функция, которую можно использовать для поиска родительского ключа любого многомерного объекта. Я использую 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;
})
person Frederic Fortier    schedule 05.01.2013
comment
Можете ли вы предоставить немного более подробную информацию о том, как он будет использоваться и каковы параметры. - person Flak DiNenno; 07.02.2013