Accessing or creating nested JavaScript objects with string key without eval

前端 未结 2 1454
无人及你
无人及你 2020-12-04 00:35

I am looking for a nice solution to access a property by string value, but if the property does not exist it should create it. If the root structure already has defined some

2条回答
  •  一向
    一向 (楼主)
    2020-12-04 01:01

    You could split the path and reduce the path by walking the given object. If no Object exist, create a new property with the name, or an array. Later assign the value.

    function setValue(object, path, value) {
        var way = path.replace(/\[/g, '.').replace(/\]/g, '').split('.'),
            last = way.pop();
    
        way.reduce(function (o, k, i, kk) {
            return o[k] = o[k] || (isFinite(i + 1 in kk ? kk[i + 1] : last) ? [] : {});
        }, object)[last] = value;
    }
    
    var test = {};
    setValue(test, "foo.name", "Mr. Foo");
    setValue(test, "foo.data[0].bar", 100);
    setValue(test, "and.another[2].deep", 20);
    console.log(test);

提交回复
热议问题