Keeping only certain properties in a JavaScript object

后端 未结 11 1026
时光说笑
时光说笑 2020-12-20 11:05

I have an object. I would like to modify the object (not clone it) by removing all properties except for certain specific properties. For instance, if I started with this o

11条回答
  •  孤城傲影
    2020-12-20 12:01

    You could use delete :

    for (var k in myObj) {
        if (k !== 'p1' && k !== 'p2' && k !== 'p100') {
            delete myObj[k];
        }
    }
    

    An alternative to indexOf :

    var keep = /^p(1|2|100)$/;
    for (var k in myObj) {
        if (!keep.test(k)) {
            delete myObj[k];
        }
    }
    

    Shorter :

    var keep = /^p(1|2|100)$/;
    for (var k in myObj) {
        keep.test(k) || delete myObj[k];
    }
    

    Array to RegExp :

    var keep = [1, 2, 100];
    keep = new RegExp('^p(' + keep.join('|') + ')$'); // /^p(1|2|100)$/
    keep.test('p1'); // true
    keep.test('p3'); // false
    

    Useful with a function :

    function keep(o, ids) {
        var keep = new RegExp('^p(' + ids.join('|') + ')$');
        for (var k in o) keep.test(k) || delete o[k];
        return o;
    }
    

    Usage :

    keep(myObj, [1, 2, 100]); // { p1: 123, p2: 321, p100: 3434 }
    

    You don't like regular expressions but still want a bullet proof solution :

    function keep(o, keys) {
        for (var k in o) contains(keys, k) || delete o[k];
        return o;
    }
    
    function contains(array, value) {
        var i = -1, l = array.length;
        while (++i < l) if (array[i] === value) return true;
        return false;
    }
    
    function prefix(array, prefix) {
        var i = -1, l = array.length, output = [];
        while (++i < l) output.push(prefix + array[i]);
        return output;
    }
    

    Usage :

    keep(myObj, ['p1', 'p2', 'p100']);
    // with a middleman :
    var idsToKeep = [1, 2, 100];
    keep(myObj, prefix(idsToKeep, 'p'));
    

    Well, I could go on like this infinitely, but it's time to eat.

提交回复
热议问题