【问题标题】:Stop overriding object once it has been set dynamically [closed]动态设置对象后停止覆盖对象[关闭]
【发布时间】:2017-06-19 16:23:03
【问题描述】:

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

我做错了什么?

例如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'
                ]

【问题讨论】:

  • 这是做什么用的? object = object[keys[i]] = {}; 它最终只是创建了一个空对象,这似乎不是您想要的。
  • @DanielBeck 看到我的答案...... OP 正试图通过一系列嵌套键迭代他们的方式。该函数实际上可以工作,但最终返回的是对最里面的对象的引用,而不是原始输入。

标签: javascript arrays object


【解决方案1】:

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

var current = object;

然后在函数的其余部分使用current 而不是object。然后您可以返回object,它仍然是您原始输入的引用。

编辑: OP 没有使用返回值开始,所以我原来的解决方案没有帮助。问题是 OP 传入了相关的密钥集(“price.minPrice”、“price.maxPrice”),并且该函数覆盖了初始共享密钥的值(“price”)。解决方案是在分配空对象之前检查相关键处是否已经存在对象。

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');

【讨论】:

  • 否决?这个线程发生了什么?
  • 我没有投反对票,但很难理解为什么这会解决问题。你能显示完整的代码吗?
  • 好的,等等……
  • 我仍然有同样的问题 - 很遗憾
  • 再看一下我的代码示例...我添加了一个测试来验证它是否按预期工作。您能否使用当前版本的函数编辑您的原始帖子?
猜你喜欢
  • 2013-02-08
  • 2021-07-25
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-21
  • 1970-01-01
相关资源
最近更新 更多