我正在使用点表示法动态创建对象。这部分工作正常!我遇到的问题是我在每次迭代时都覆盖了对象。一旦设置,它应该只添加到对象以覆盖和替换属性。
我做错了什么?
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'
]
答案 0 :(得分:1)
这里的问题是您没有保存对原始对象的引用...您在for循环中覆盖了object
变量,然后返回该值的最终值变量。也许你应该添加一行:
var current = object;
然后在您的其余功能中使用current
代替object
。然后你可以返回object
,它仍然是你原始输入的参考。
编辑: OP并没有使用返回值开头,因此我的原始解决方案没有帮助。问题是OP传递了相关的密钥集(&#34; price.minPrice&#34;,&#34; price.maxPrice&#34;)并且该函数覆盖了初始共享密钥的值(&# 34;价格&#34)。解决方案是在分配空的对象之前检查对象上是否已存在对象。
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;