Find and update in nested json object

You forgot to pass newValue in the nested call

function getObjects(obj, key, val, newVal) {
    var newValue = newVal;
    var objects = [];
    for (var i in obj) {
        if (!obj.hasOwnProperty(i)) continue;
        if (typeof obj[i] == 'object') {
            objects = objects.concat(getObjects(obj[i], key, val, newValue));
        } else if (i == key && obj[key] == val) {
            obj[key] = 'qwe';
        }
    }
    return obj;
}

This ?

function update(obj, key, newVal) {
    for(var i in obj) {
        if(typeof obj[i] == 'object') {
            update(obj[i], key, newVal));
        } else if(i === key) {
            obj[i] = newVal;
        }
    }
    return obj;
}