嵌套对象中的ES6默认参数

时间:2017-05-10 14:13:23

标签: javascript ecmascript-6

我希望在嵌套对象中有一个带默认参数的函数,我希望能够将其称为f()或仅指定单个参数。 具有默认参数的嵌套对象的函数:



function f({ a = 1, callback = ({ name, param } = { name: "qwe", param: 123 }) } = {}) {
    console.log("a:", a);
    console.log("callback:", callback);
}

// And I want to run it like this:

f();
f({ callback: { params: "456" } });

// But 'callback.name' becomes undefined.




4 个答案:

答案 0 :(得分:4)

当解构与默认参数混合时,我承认代码很难读写(特别是当有嵌套对象时......)。

但我认为你正试图这样做:

function f({callback: {name = "cbFunction", params = "123"} = {}} = {}) {
  console.log(name);
  console.log(params);
}

f();
f({callback: {params: '789'}});

答案 1 :(得分:1)

@Badacadabra的回答几乎是正确的,但缺少了问题中指定的其他顶级参数。

function f({a = 1, callback: {name = "qwe", params = "123"} = {}} = {}) {
  console.log(a);
  console.log(name);
  console.log(params);
}

但是请注意,在函数体内,callback的属性是在没有包含对象的情况下寻址的。如果需要,可以将它们重构为这样的对象:

const callback = { name, params }

无论哪种方式,从调用点开始,它就可以填补所有级别的所有缺失值,例如:

f({a: 2})

f({a: 2, callback: { name: "abc"}})

f({a: 2, callback: { params: "456" }})

编辑

回应Joakim的评论:

TotalAMD在评论中还说:“我想使用具有相同字段名称的多个嵌套对象”。因此,如果他尝试使用callback1和callback2作为参数的方法,那么他将不得不在其中使用不同的字段名称。

我错过了原来的要求。在函数接口中维护所需的重复嵌套名称的一种方法是在函数范围内为其别名,如下所示:

function f({
    a = 1, 
    callback1: {name: name1 = "abc", params: params1 = "123"} = {},
    callback2: {name: name2 = "def", params: params2 = "456"} = {},
} = {}) {
  console.log(a);
  console.log(name1);
  console.log(params1);
  console.log(name2);
  console.log(params2);
}

然后您可以使用设计的界面和预期的结果调用该函数:

f ({ callback1: { name: "One" }, callback2: { name: "Two" } })

注意事项:尽管在技术上可能并且可能有用,但在更深的嵌套层次上可能会变得混乱。那么可能值得寻找一种间接接口较少的替代接口设计。

答案 2 :(得分:0)

原来这样称之为解决问题,但这是最好的方法吗?

function f({
  a = 1,
  callback = ({
    name,
    param
  } = {
    name: "qwe",
    param: 123
  })
} = {}) {
  console.log("a:", a);
  console.log("callback:", callback);
}

f();
f({ callback: { name, params: "456" } });

答案 3 :(得分:0)

我没有找到他想要的答案。但这实际上可以通过某种性感的方式实现:

EDIT :简化的语法,还显示了如何为子对象添加默认值)

function f({
    a = 1,
    callback = {}
  } = {}) {
  callback = { // default values
    name: "cbFunction",
    params: "123",
    ...callback // overwrites it with given values
  }
  // do the same for any subobjects
  callback.subObject = {
    arg1: 'hi',
    arg2: 'hello',
    ...callback.subObject
  }
  console.log("a:", a)
  console.log("callback:", callback)
}

f()
f({a: 2, callback: {params: '789', subObject: {arg2: 'goodbye'}}})