【问题标题】:Declaring variables in for loop using object properties使用对象属性在 for 循环中声明变量
【发布时间】:2016-09-01 21:45:29
【问题描述】:

我正在尝试使用对象的属性找到一种更短的清除变量的方法。

我有一个“userOptions”对象作为参数传入,如下所示:

var example = new myFunction({
    maxLimit: 30,
});

在 myFunction 中,我有另一个名为“defaultOptions”的对象,我将其与 userOptions 进行比较,以将选项声明为变量。下面的例子可能看起来已经足够短了。 However it starts to get inefficient when number of options increases.

function myFunction(userOptions) {
    var defaultOptions = {
        maxLimit: 20,
        minLimit: 10
    }

    // Apply user options
    for (var i in defaultOptions) {
        if (userOptions.hasOwnProperty(i)) {
            defaultOptions[i] = userOptions[i];
        }
    }

    // Declare variables
    var maxLimit = defaultOptions.maxLimit;
    var minLimit = defaultOptions.minLimit;
}

This question 有点类似于我正在尝试做的事情。但是答案建议像我已经做的那样一一访问对象属性。

有没有更好的方法来完成这项任务?比如在 for 循环中声明变量或将更新的选项对象的属性提取为变量?

【问题讨论】:

  • 有点不清楚您要完成什么。如果您有这个具有您想要的值的defaultOptions 对象,为什么不直接通过该对象访问它们呢?即,无论你在哪里访问maxLimit,只要写defaultOptions.maxLimit(你不需要使用括号语法)。
  • 这就是大多数库(例如 jQuery 和 jQuery UI)所做的。除了一些为了方便而经常使用的选项。
  • 如果您不想继续输入像defaultOptions 这样的长名称,可以给它一个短名称,例如var do = defaultOptions;。然后就是do.maxLimit

标签: javascript variables object for-loop iteration


【解决方案1】:

好像您正在寻找Object.assign,右侧的参数会覆盖左侧对象的重叠属性:

console.log(Object.assign({ id: 1, name: 'Hello' }, { name: 'World' }));

可以这样使用:

var config = Object.assign(defaultOptions, userSuppliedOptions);

如果您只是想要常规变量并且可以访问 ES6,您也可以使用 destructuring assignment 使事情更简洁:

let { minLimit, maxLimit } = defaultOptions;

【讨论】:

  • 他的问题是关于分配给普通变量,而不是如何合并对象。
  • @Barmar - 感谢您指出这一点,我明白您的意思。我仍然认为这可能是比分配给普通变量更好的解决方案,所以我将暂时离开它
  • 这与他的for 循环有何不同?
  • @Barmar 我想它是在说“我正在尝试寻找更短的方法......”,尽管正如你所指出的 - 我忽略了“声明全局变量”部分。他们可以做一些愚蠢的事情,比如:Object.assign(window, { foo: 'bar' }) 虽然......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
  • 2012-08-29
相关资源
最近更新 更多