Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

javascript find parent of array item

I have an array item like this:

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

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

I want to find the state from just having the array. How do I do this? Thanks.

function findParent(array) {
  // do something
  // return NY
}
like image 398
Mark Avatar asked Mar 18 '26 18:03

Mark


2 Answers

In Javascript, array elements have no reference to the array(s) containing them.

To achieve this, you will have to have a reference to the 'root' array, which will depend on your data model.
Assuming USA is accessible, and contains only arrays, you could do this:

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;
                }
            }
        }
    }
}

Note that I’ve renamed the array parameter to item since you’re passing along a value (and array item), and you expect the array to be returned.
If you want to know the name of the array, you should return member instead.

like image 135
Martijn Avatar answered Mar 20 '26 09:03

Martijn


Here is a generic function that can be used to find the parent key of any kind of multi-dimentional object. I use underscore.js by habit and for conciseness to abstract array vs associative array loops.

(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;
})
like image 28
Frederic Fortier Avatar answered Mar 20 '26 08:03

Frederic Fortier



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!