动态设置后停止覆盖对象

时间:2017-06-19 16:23:03

标签: javascript arrays object

我正在使用点表示法动态创建对象。这部分工作正常!我遇到的问题是我在每次迭代时都覆盖了对象。一旦设置,它应该只添加到对象以覆盖和替换属性。

我做错了什么?

E.g。 price": { "minPrice": 1000, "maxPrice": 10000 }不是{ "minPrice": value}{ "maxPrice": value }

ausedSet(params, key, value);

function ausedSet(object, key, value) {
    var keys = key.split('.');

    for (var i = 0; i < keys.length - 1; i++) {
        object = object[keys[i]] = {};

    }
    object[keys[keys.length - 1]] = value;

    return object;
}

function getValidParams(value, key) {
                if (acceptedParameters.indexOf(key) > -1) {
                    populateObject(vm.filterParameters, key, value);
                }
            }
//vm.filterParameters returns these

    var acceptedParameters = [
                    'postCode',
                    'distance',
                    'locale',
                    'vehicleCategory',
                    'resultOrder',
                    'longLatCoordinates',
                    'price.minPrice',
                    'price.maxPrice',
                    'pagination'
                ]

1 个答案:

答案 0 :(得分:1)

这里的问题是您没有保存对原始对象的引用...您在for循环中覆盖了object变量,然后返回该值的最终值变量。也许你应该添加一行:

var current = object;

然后在您的其余功能中使用current代替object。然后你可以返回object,它仍然是你原始输入的参考。

编辑: OP并没有使用返回值开头,因此我的原始解决方案没有帮助。问题是OP传递了相关的密钥集(&#34; price.minPrice&#34;,&#34; price.maxPrice&#34;)并且该函数覆盖了初始共享密钥的值(&# 34;价格&#34)。解决方案是在分配空的对象之前检查对象上是否已存在对象。

&#13;
&#13;
function populateObject(obj, keyString, value) {
    var keys = keyString.split('.'),
        curr = obj;

    for (var i = 0; i < keys.length - 1; i++) {
        if (!curr[keys[i]]) curr[keys[i]] = {};
        curr = curr[keys[i]];

    }
    curr[keys[keys.length - 1]] = value;

    return obj;
}

var myObject = { foo: 'bar' };
var result = populateObject(myObject, 'some.nested.keys', 'something');

result = populateObject(result, 'some.nested.other', 'test');

console.log(result === myObject);
console.log(result.foo === 'bar');
console.log(result.some.nested.keys === 'something');
console.log(result.some.nested.other === 'test');
&#13;
&#13;
&#13;