1

How to get e's value without knowing which group, which means only use obj and e?

And also can use same way to get a.

Thanks

let obj:Object = {
  a: 'value1',
  b: 'value2',
  group1: {
    c: 'value3',
    d: 'value4'
  },
  group2: {
    e: 'value5',
    f: 'value6'
  }
};
Hongbo Miao
  • 45,290
  • 60
  • 174
  • 267
  • Besides flattening out the object, there really is no way to accomplish what you're asking for. – ndugger Feb 22 '16 at 17:52

3 Answers3

4

I would do it like this:

function findValue(key, obj) {
    for (var i in obj) {
        if (obj.hasOwnProperty(i)) {
            if (i === key) {
                return obj[i];
            } else if (typeof(obj[i]) == "object") {
                var value = findValue(key, obj[i]);
                if (typeof(value) !== "undefined") { return value; }
            }
        }
    }
}

findValue('a', obj);
//"value1"
findValue('e', obj);
//"value5"
dave
  • 62,300
  • 5
  • 72
  • 93
2

You can use Object.keys() to iterate through properties and Object.hasOwnProperty() to test if object contains property:

let key = Object.keys(obj)
                .find(k => obj[k].hasOwnProperty('e'));

console.log(obj[key].e);
madox2
  • 49,493
  • 17
  • 99
  • 99
2

Version which returns falsy values, too.

function find(key, object) {
    var value;
    Object.keys(object).some(function (k) {
        if (key === k) {
            value = object[k];
            return true;
        }
        if (typeof object[k] === 'object') {
            value = find(key, object[k]);
            return value !== undefined;
        }
    });
    return value;
}

var obj = { a: 'value1', b: 'value2', group1: { c: 'value3', d: 'value4' }, group2: { e: 'value5', f: 'value6' }, group3: { g: '', h: 0 } };

document.write(find('e', obj) + '<br>');
document.write(find('g', obj) + '<br>');
document.write(find('h', obj) + '<br>');
Nina Scholz
  • 376,160
  • 25
  • 347
  • 392